3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
我從 Stuart Marks 本人那里找到了背后的原因
http://mail.openjdk.java.net/pipermail/core-libs-dev/2016-October/044026.html
這與嵌套泛型(Optional
嵌套在內(nèi)部Function
)有關(guān)。從郵件線程
Function<..., Optional<StringBuilder>>不是的子類型
Function<..., Optional<? extends CharSequence>>為了解決這個(gè)問題,我們還必須添加外部通配符,這樣
Function<..., Optional<StringBuilder>>是一個(gè)子類型
Function<..., ? extends Optional<? extends CharSequence>>

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
FWIW,在 Java 11 中的Stream.iterate和Stream.iterate中仍然存在與協(xié)變參數(shù)類似的問題。當(dāng)前的方法簽名是
static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
這些簽名不允許某些UnaryOperator從類型角度來看合理的種子和 s 組合,例如,以下內(nèi)容無法編譯:
UnaryOperator<String> op = s -> s;
Stream<CharSequence> scs = iterate("", op); // error
建議的解決方案是將方法簽名更改為
static <T, S extends T> Stream<T> iterate(S seed, Predicate<? super S> hasNext, UnaryOperator<S> next)
static <T, S extends T> Stream<T> iterate(S seed, UnaryOperator<S> f)
因此,與Optional.or和Optional.flatMap相比, 這是“附加類型參數(shù)方法”實(shí)際起作用的情況。

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
是的...據(jù)說帶有extends-bound(上限)的通配符使類型 covariant,這意味著例如List<Apple>是List<? extends Fruit>(考慮到Appleextends Fruit)的實(shí)際子類型;這也稱為協(xié)方差。
或者在您展示的示例中,這意味著它Optional<StringBuilder>是 的子類型Optional<? extends Optional<? extends CharSequence>>,因此您可以例如執(zhí)行以下操作:
List<Optional<String>> left = new ArrayList<>();
List<? extends Optional<? extends CharSequence>> right = new ArrayList<>();
right = left; // will compile
或分配Function給另一個(gè)
添加回答
舉報(bào)