我有一些在内部使用泛型的代码。到目前为止一切都很好,直到通过公共(public) API 公开功能为止。该问题与以下玩具示例相同:我有一个 List
具有特定子类型的包装元素(本例中为 T extends Number
)。当我想退回这个List
时,我目前正在返回 List<Wrapper<? extends Number>>
这使得客户端代码非常冗长。
是否可以将返回类型更改为 List<Wrapper<Number>>
?客户端不需要知道包装器包含任何特定类型的数字。我尝试了几种转换方法,但它们都因编译错误而失败。
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;
}
}
最佳答案
根据您所展示的有关 Wrapper
的信息类型,Wrapper<? extends Number>
正是您想要的情况,因为只能从您的 Wrapper
中获取项目(它是生产者),并且不可能放入元素。所以当你调用getItem()
时在Wrapper<? extends Number>
上,它返回 Number
,这就是你想要的。怎么不符合您的需求?
“冗长”并不是不放弃类型安全的正当理由。
关于java - 去掉返回值中的通配符参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12336992/