在Java中,List与List有何不同?扩展对象>?
注意:这与 我被Java的泛型弄糊涂了 ArrayList 工作但是在Java中,List与List有何不同?扩展对象>?,java,generics,inheritance,types,Java,Generics,Inheritance,Types,注意:这与 我被Java的泛型弄糊涂了 ArrayList 工作但是 List<Object> list = new ArrayList<String>(); 不匹配,因为如果泛型表达式不包含通配符,则它们必须完全匹配 请注意,在声明端最好使用List而不是ArrayList,因为它允许您在稍后阶段更改实现,例如更改为LinkedList 工作但是 List<Object> list = new ArrayList<String>(); 不匹配
List<Object> list = new ArrayList<String>();
不匹配,因为如果泛型表达式不包含通配符,则它们必须完全匹配
请注意,在声明端最好使用List而不是ArrayList,因为它允许您在稍后阶段更改实现,例如更改为LinkedList
工作但是
List<Object> list = new ArrayList<String>();
不匹配,因为如果泛型表达式不包含通配符,则它们必须完全匹配
请注意,在声明端,最好使用List而不是ArrayList,因为它允许您在稍后阶段更改实现,例如更改为LinkedList。以下两种情况都不起作用,因为您正在初始化不同于预期的对象类型:
ArrayList<Object> y = new ArrayList<String>();
ArrayList<String> y2 = new ArrayList<Object>();
还可以考虑使用
只要编译器可以从上下文推断类型参数,就可以用一组空的类型参数替换调用泛型类的构造函数所需的类型参数。这对尖括号非正式地称为菱形
以下两种情况都不起作用,因为您正在初始化与预期不同的对象类型:
ArrayList<Object> y = new ArrayList<String>();
ArrayList<String> y2 = new ArrayList<Object>();
还可以考虑使用
只要编译器可以从上下文推断类型参数,就可以用一组空的类型参数替换调用泛型类的构造函数所需的类型参数。这对尖括号非正式地称为菱形
在Java中,类型参数必须完全匹配 考虑以下代码段:
ArrayList<Object> list = new ArrayList<String>();
list.add(new SomeClass());
我们现在已经成功地向ArrayList添加了一个非字符串。第二条语句没有错:我们正在向ArrayList添加一些对象。所以第一句话肯定有问题!这就是Java不允许您这样做的原因
如果将代码段更改为:
ArrayList<? extends Object> list = new ArrayList<String>();
list.add(new SomeClass());
您将注意到错误现在位于第二行。无法将对象添加到列表中
两者的区别如下:
ArrayList指包含对象的ArrayList。当然,这样的列表还可以包含对象子类的实例。因为每个对象都是对象的实例,所以此列表可以包含本例中的任何对象
ArrayList在Java中,类型参数必须完全匹配 考虑以下代码段:
ArrayList<Object> list = new ArrayList<String>();
list.add(new SomeClass());
我们现在已经成功地向ArrayList添加了一个非字符串。第二条语句没有错:我们正在向ArrayList添加一些对象。所以第一句话肯定有问题!这就是Java不允许您这样做的原因
如果将代码段更改为:
ArrayList<? extends Object> list = new ArrayList<String>();
list.add(new SomeClass());
您将注意到错误现在位于第二行。无法将对象添加到列表中
两者的区别如下:
ArrayList指包含对象的ArrayList。当然,这样的列表还可以包含对象子类的实例。因为每个对象都是对象的实例,所以此列表可以包含本例中的任何对象
ArrayListI我不认为这是重复的。我以前在搜索中遇到过这个帖子,但这里不是关于vs的。这也是一个阅读集合和泛型的好帖子:我不认为它是重复的。我以前在搜索中遇到过这个线程,但这里不是关于vs的。这也是一个阅读集合和泛型的好线程:那么为什么Object obj=new String;工作泛型表达式的工作方式不同,或者只是历史上不断增长的不一致,这背后是否有逻辑和有意识的设计决策?@chrisofner Object obj=new String;之所以有效,是因为每个字符串也是一个对象。但是列表不也是列表,因为你可以在列表中放入Long,但不能在列表中放入Long。这就是为什么编译器不允许这个赋值;工作泛型表达式的工作方式不同,或者只是历史上不断增长的不一致,这背后是否有逻辑和有意识的设计决策?@chrisofner Object obj=new String;之所以有效,是因为每个字符串也是一个对象。但是列表不也是列表,因为你可以在列表中放入Long,但不能在列表中放入Long。这就是为什么编译器不允许这个赋值;然后z[2]=ALP3;所有的编译都很好。我只是在运行时收到一个ArrayStore异常。你的两个要点为我很好地阐明了区别。非常感谢@克里斯托夫纳。是的,数组早于泛型,工作方式不同。特别是,字符串[]被视为对象[]的子类型,但列表不是列表的子类型;然后z[2]=ALP3;所有的编译都很好。我只是在运行时收到一个ArrayStore异常。你的两个要点
我为我清楚地说明了区别。非常感谢@克里斯托夫纳。是的,数组早于泛型,工作方式不同。特别是,字符串[]被视为对象[]的子类型,但列表不是列表的子类型。