java - 去掉返回值中的通配符参数

标签 java generics wildcard

我有一些在内部使用泛型的代码。到目前为止一切都很好,直到通过公共(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/

相关文章:

java - 这可能吗? : HashMap<String, 字符>

java - 抽象计划服务 : shutdown underlying executor

mysql数字通配符

sql - 搜索(在 Oracle 中),使用通配符,无需担心单词出现的大小写或顺序

java - Quartz API 和 Joda Time API 之间有什么关系?

java - 生成 UI 组件

generics - F# 泛型类型问题

java - 你能定义一个既有下界又有上限的通用界限吗?

linux - 为什么 Unix 通配符 "*"不包括 ".*"?

java - 如何预先设置流立即刷新