如果我在接受List <! - 的方法中实现List并调用add会怎么样?扩展SuperType - >

时间:2012-02-25 07:48:59

标签: java generics

我已阅读以下代码段将导致compiler error

void tryAddingToList(List<? extends SuperType> list) {
  list.add(new SubType());
}

现在我的问题是:  究竟是谁制定了限制,限制是如何设定的?编译器是否在这种方法实现中专门检查add方法调用?

如果是,如果我实现自己的List而不是add,请引入一个与addToList完全相同的新add方法,并调用该方法在tryAddingToList方法?

更好的是,如果我实现我的get方法,它也会“秘密地”在列表中添加一些内容(不要问我为什么有人会这样做;我只是很好奇)。

3 个答案:

答案 0 :(得分:1)

您应该明确地将SubType投射到SuperType。因为并非SuperType的所有对象都是SubType(可以键入其他子类)。 This可能会给你一些提示。祝你好运。

答案 1 :(得分:1)

是的,确实是应用限制的编译器。实际编译为字节代码时,大多数信息(不是全部)都将被删除。您应该将泛型解释为开发人员的额外信息,因此我们不会犯愚蠢的错误。

答案 2 :(得分:1)

您应该在这里使用super代替extends

void tryAddingToList(List<? super SubType> list) {
    list.add(new SubType());
}

假设有3种类型SuperTypeSubType1SubType2。在原始代码中,List<? extends SuperType>可能是List<SubType2>,您无法将SubType1添加到List<SubType2>

相关问题