2

我有一些在内部使用泛型的代码。到目前为止一切都很好,直到通过公共 API 公开功能。该问题与以下玩具示例相同:我有一个List具有特定子类型的包装项目(T extends Number在此示例中)。当我想返回 thisList时,我目前正在返回 a List<Wrapper<? extends Number>>,这使得客户端代码非常冗长。

是否有可能将返回类型更改为List<Wrapper<Number>>?客户不需要知道 Wrappers 包含任何特定类型的 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;
    }
}
4

3 回答 3

2

根据您所展示的有关您的Wrapper类型的内容,Wrapper<? extends Number>正是您想要的情况,因为只能从您的Wrapper(它是生产者)中取出物品,而不能放入物品。所以当您致电getItem()时a Wrapper<? extends Number>,它返回 a Number,这就是你想要的。它怎么不符合你的需要?

“冗长”不是不抛弃类型安全的正当理由。

于 2012-09-09T09:14:39.990 回答
0

据我所知,如果你想返回 T 是不可能的。当你想返回 T 时,你不能返回 T 的子类型

于 2012-09-09T07:17:24.640 回答
0

我刚刚发现以下方法有效。任何关于潜在陷阱的反馈和评论仍然非常感谢。

public static List<Wrapper<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 (List<Wrapper<Number>>)(List<?>)numbers;
}
于 2012-09-09T07:30:18.080 回答