這個問題在這里已經有了答案: 什么是PECS(Producer Extends Consumer Super)? (16 個答案) 3天前關閉。
有一個名為 Foo 的類,如下所示:
public class Foo<E> {
private List<E> ls;
public Foo(List<E> ls) {
this.ls = ls;
}
public void add(E l) {
this.ls.add(l);
}
public <F> Foo<F> map(Function<? super E, ? extends F> f) {
Foo<F> res = new Foo<F>(new ArrayList<F>());
for (E l : ls) {
res.add(f.apply(l));
}
return res;
}
}
然后,我從 main 呼叫:
//Main.java
Foo<Integer> foo1 = new Foo<>(Arrays.asList(1,2,3,4));
Foo<String> foo2 = foo1.map(a -> a.toString());
我想看看將函式定義為如何Function<? super E, ? extends F>比Function<E,F>? 是否Function<? super E, ? extends F>具有最大的靈活性?您能否通過更改在示例中顯示它Main.java?
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/houduan/477887.html
上一篇:不變泛型似乎無法正常作業
下一篇:重心有理插值
