我有一些內部使用泛型的代碼。到目前爲止,一切都很好,直到通過公共API公開功能。問題與以下玩具示例相同:我有一個List
包裝物品,其中包含特定的子類型(本例中爲T extends Number
)。當我想返回List
時,我正在返回一個List<Wrapper<? extends Number>>
,這使得客戶端代碼非常冗長。擺脫返回值中的通配符參數
是否有可能將退貨類型更改爲List<Wrapper<Number>>
?客戶不需要知道,Wrappers包含任何特定類型的數字。我嘗試了幾種鑄造方法,但它們都會因編譯錯誤而失敗。
public static List<Wrapper<? extends Number>> getNumbers() {
Wrapper<Integer> number1 = new Wrapper<Integer>(1);
Wrapper<Double> number2 = new Wrapper<Double>(2.);
List<Wrapper<? extends Number>> numbers = new ArrayList<Wrapper<? extends Number>>();
numbers.add(number1);
numbers.add(number2);
return numbers;
}
class Wrapper<T extends Number> {
private final T item;
Wrapper(T item) {
this.item = item;
}
T getItem() {
return item;
}
}
這是錯誤的。 '包裝'不是'包裝',即使'整數'是'數字'。所以你在做什麼是撒謊的類型系統。 –
newacct
另外,如果你打算這樣做,爲什麼不直接聲明'number1'和'number2'是'Wrapper'?那麼你不需要做任何瘋狂的投射。 –
newacct