Typy uogólnione w Function

0

Cześć

Mamy interfejs Function, a w nim powiedzmy metodę andThen. Ogólna zasada działania jest mi znana, nie rozumiem samej implementacji.

public interface MyFunction<T, R> {
	R apply(T t);
	
	//ok
	default <V> MyFunction<T, V> andThen(MyFunction<? super R, ? extends V> after) {
		return (T t) -> after.apply(this.apply(t));
	}
	
	//not working
	default MyFunction<T, R> andThen2(MyFunction<T, R> after) {
		return (T t) -> after.apply(this.apply(t));
	};
}

T - parametr funkcji, R - wynik zwracany, ale nie rozumiem idei literki V. No bo jeśli mam na wejściu funkcję <T,R> i robię do niej andThen to rezultatem tego jest w dalszym ciągu funkcja <T,R>. Pytanie brzmi po co jest V i dlaczego andThen2 nie działa.

2

Masz taki ciag
1 R apply (T t)
czyli twoim typem zwracanym będzie na pewno R
w linijce return (T t) -> after.apply(this.apply(t));
after.apply(_) dostaje na wejściu typ R (który dziedziczy/implementuje -> słówko kluczowe super )
Ale nie wiesz jaki typ będzie zwracany więc definiujesz literę V, która jest dowolnym typem zwracanym

andThen2 nie działa bo -> this.apply(t) zwróci typ R, a ty masz definicję MyFunction<T, R> after czyli after jako argument wejściowy dostanie typ R zamiast T co mu nie pasuje

2
MiletZTalesu napisał(a):

T - parametr funkcji, R - wynik zwracany, ale nie rozumiem idei literki V. No bo jeśli mam na wejściu funkcję <T,R> i robię do niej andThen to rezultatem tego jest w dalszym ciągu funkcja <T,R>. Pytanie brzmi po co jest V i dlaczego andThen2 nie działa.

eee, jak masz funkcję T do R i złożysz ją z funkcją R do V to dostajesz funkcję T do V.

wyjaśnienie np. tutaj: https://pl.wikipedia.org/wiki/Z%C5%82o%C5%BCenie_funkcji

matematyczne złożenie jest odpowiednikiem metody Function.compose. jednak compose i andThen są, nazwijmy to, dwiema stronami tego samego medalu, tzn. a.andThen(b) to to samo co b.compose(a).

0

Tak, zorientowałem się, że głupotę tam napisałem. Przepływ jest taki, że najpierw biorę pierwszą funkcję pcham jej T i ona mi zwraca R. To zwrócone R pcham w drugą funkcję i ona mi zwraca jakieś V. Wszystko jasne. Dzięks.

1 użytkowników online, w tym zalogowanych: 0, gości: 1