Java匿名泛型继承

Java匿名泛型继承,java,generics,Java,Generics,看看下面的代码: ArrayList<? extends Object> list = new ArrayList<Object>(); list.add(new Object()); ArrayList我认为原因在于泛型类型不是多态的。当您将通配符?与扩展一起使用时,除了null之外,您不能在集合中添加任何内容 下面是一个例子,说明如果允许的话会发生什么: Class Car{ } class A extends Car { } class B extends C

看看下面的代码:

ArrayList<? extends Object> list = new ArrayList<Object>();
list.add(new Object());

ArrayList我认为原因在于泛型类型不是多态的。当您将
通配符?
与扩展一起使用时,除了null之外,您不能在集合中添加任何内容

下面是一个例子,说明如果允许的话会发生什么:

Class Car{

}
class A extends Car {

}
class B extends Car{

}
现在您有了
列表
这是合法的。显然,语言语义不允许您将
对象添加到这样的列表中。事实上,他们根本不允许您添加任何内容,除了
null
,或者您直接从列表中检索的内容

正如Lukas在评论中所指出的,甚至将列表自己的项添加回列表中也绝非小事:您需要一个助手方法将通配符捕获到命名类型中

public static void main(String[] args) {
  ArrayList<? extends Object> list = new ArrayList<String>();
  addOwn(list);
}
static <T> void addOwn(List<T> l) { l.add(l.get(0)); }
publicstaticvoidmain(字符串[]args){

ArrayList问题在于
Foo extends Object
并不意味着
Collection
可以被视为
Collection
的子类型。这仅仅是因为前一个类不允许您完成后者所做的一切;例如,您不能使用泛型将
对象添加到
集合中Foo

或者你直接从列表中检索到的东西。这会让我感到惊讶。你能举个例子吗?:-)来吧。你怎么知道的?;-)注意,这里有另一个“常用习惯用法”为了克服Java语言愚蠢的局限性:;-)我只想指出,你永远不知道他们是否只是缺少时间,或者是因为一些边缘情况而碰上了一堵墙。这就是我当时问的原因。不幸的是,在这些问题上很难得到权威的答案。很少有人记得万特邮件列表从10年前就开始了。在这种情况下,我想,正确使用这个“功能”并不会增加它的影响力。
List<B> someList = new Array:list<B>(); 
somemethod(someList);
ArrayList<? extends Object>
ArrayList<?>
ArrayList<? extends Object> list = new ArrayList<String>();
public static void main(String[] args) {
  ArrayList<? extends Object> list = new ArrayList<String>();
  addOwn(list);
}
static <T> void addOwn(List<T> l) { l.add(l.get(0)); }