[英]How to use a generic result as a generic parameter when the type is a wildcard?
[更新]真實情況比我最初提出的問題要復雜一些。 我已經改變了一些代碼來反映這一點。[/ UPDATE]
我對以下行為感到有點難過。 給出如下代碼:
interface Inter<T> {
T makeT();
void useT(T t);
}
public class Foo {
public void bar(Qux q) {
Inter<?> x = getInterForQux(q);
x.useT(x.makeT());
}
Inter<?> getInterForQux(Qux q) {
if( someTest(q) ) {
return (Inter<Integer>) mkAnInterInt();
} else {
return (Inter<Double>) mkAnInterDouble();
}
}
}
Javac給了我錯誤:
Inter <capture#478 of?>中的useT(捕獲#478?)無法應用於(java.lang.Object)
而Eclipse給了我:
Inter <capture#1-of?>類型中的方法useT(捕獲#1-of?)不適用於參數(捕獲#2-of?)
顯然,不管是什么T
的結果是類型makeT()
相同的參數類型的useT()
為什么我不能這樣做? 有解決方法嗎?
當您使用通配符,編譯器無法看到的返回類型x.makeT()
和參數類型x.useT()
是相同的。 為了保證它們是相同的,你應該在這里使用泛型方法:
public class Foo {
public <T> void bar(Inter<T> x) {
x.useT(x.makeT());
}
}
這是合乎邏輯的,因為Inter<?>.makeT()
可以返回任何內容,而Inter<?>.useT(..)
會消耗任何東西,但兩個任何東西都可以不同。
那會解決它:
public <T> void bar(Inter<T> x) {
x.useT(x.makeT());
}
使用捕獲助手:
public void bar(Qux q) {
Inter<?> x = getInterForQux(q);
barPrivate(x);
}
private <T> void barPrivate(Inter<T> x) {
x.useT(x.makeT());
}
這為您提供了相同的bar
簽名
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.