我已阅读以下代码段将导致compiler error
void tryAddingToList(List<? extends SuperType> list) {
list.add(new SubType());
}
现在我的问题是:
究竟是谁制定了限制,限制是如何设定的?编译器是否在这种方法实现中专门检查add
方法调用?
如果是,如果我实现自己的List
而不是add
,请引入一个与addToList
完全相同的新add
方法,并调用该方法在tryAddingToList
方法?
更好的是,如果我实现我的get
方法,它也会“秘密地”在列表中添加一些内容(不要问我为什么有人会这样做;我只是很好奇)。
答案 0 :(得分:1)
您应该明确地将SubType
投射到SuperType
。因为并非SuperType
的所有对象都是SubType
(可以键入其他子类)。 This可能会给你一些提示。祝你好运。
答案 1 :(得分:1)
是的,确实是应用限制的编译器。实际编译为字节代码时,大多数信息(不是全部)都将被删除。您应该将泛型解释为开发人员的额外信息,因此我们不会犯愚蠢的错误。
答案 2 :(得分:1)
您应该在这里使用super
代替extends
。
void tryAddingToList(List<? super SubType> list) {
list.add(new SubType());
}
假设有3种类型SuperType
,SubType1
,SubType2
。在原始代码中,List<? extends SuperType>
可能是List<SubType2>
,您无法将SubType1
添加到List<SubType2>
。