有一個名為 Foo 的類,如下所示:
public class Foo<E> {
private E val;
public Foo(E val) {
this.val = val;
}
public <F> Foo<F> map(Function<? super E, ? extends F> f) {
Foo<F> res = new Foo<F>(f.apply(this.val));
return res;
}
}
然后,我從 main 呼叫:
//Main.java
Foo<Integer> foo1 = new Foo<>(2);
Foo<String> foo2 = foo1.map(a -> a.toString());
我的示例Main.java也可以與Function<E, F>. 你能舉一個只能用的例子Function<? super E, ? extends F>嗎?
uj5u.com熱心網友回復:
嘗試使用 String 和 Integer 等 final 類來推理泛型是一個壞主意。
嘗試像 A > B > C 這樣的層次結構
class A {}
class B extends A {}
class C extends B {}
然后是一個例子
Foo<B> foo1 = new Foo<>(new B());
Function<A, C> aToC = a -> new C();
Foo<B> foo2 = foo1.map(aToC);
super E如果沒有和 ,這將無法作業extends F。該函式接受一個 A -foo1是一個 B,但 A 是 B 的超類 - 并回傳一個 C -foo2期待一個 B,但 C 擴展了 B。
如果您的map函式被簡單地宣告為
public <F> Foo<F> map(Function<E, F> f) {
那么上面的代碼段將無法編譯。該功能必須是Function<B, B>.
希望這能說明為什么更復雜的簽名更靈活。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/475137.html
