Java ArrayList<;T>;vs ArrayList<&燃气轮机;

Java ArrayList<;T>;vs ArrayList<&燃气轮机;,java,generics,Java,Generics,我知道ArrayList用于什么,但是什么时候应该使用ArrayList?你能举例说明吗?谢谢。据我所知,ArrayList基本上告诉编译器: 是的,我知道有一个通用版本的ArrayList可供我使用,但我真的,真的不知道我期待在这一个什么样的对象。所以不要给我警告说我没有按我应该的方式使用泛型 更新 我刚刚了解到,使用原始类型(ArrayList)和带有通配符的泛型(ArrayList)之间有着真正的区别,这不仅仅是避免编译器警告。显然,一旦您将某个对象声明为原始类型,即使泛型不是基于您省略的

我知道
ArrayList
用于什么,但是什么时候应该使用
ArrayList
?你能举例说明吗?谢谢。

据我所知,
ArrayList
基本上告诉编译器:

是的,我知道有一个通用版本的ArrayList可供我使用,但我真的,真的不知道我期待在这一个什么样的对象。所以不要给我警告说我没有按我应该的方式使用泛型

更新 我刚刚了解到,使用原始类型(
ArrayList
)和带有通配符的泛型(
ArrayList
)之间有着真正的区别,这不仅仅是避免编译器警告。显然,一旦您将某个对象声明为原始类型,即使泛型不是基于您省略的类型,也不会对该类型的任何方法起作用

因此,虽然我最初的回答基本正确,但我认为重要的是要提到使用
ArrayList
而不是
ArrayList
不仅仅是删除编译器警告的问题。

ArrayList
表示未知对象的集合,也就是说,它可以是任何对象。可以读,但不能写

听起来是这样的:

我是一个收藏品!我可以阅读未知的内容,但由于我不知道它的类型,我无法添加内容

请看Oracle提供的非常有用的信息

此外,我从麻省理工学院的一个软件构建课程中发现这些非常有用,并且这些泛型非常有用。

注意:也可以使用super指定下限 关键字而不是扩展。代码
。无界通配符
本质上与说
相同这里是一个具体的例子。假设你有一个

class Base {}
然后类
Extender扩展基{}

现在,如果您有
集合
,并且希望使用此方法调用它

public void doSomething(Collection<Base> c){...} 
public void doSomething(集合c){…}
以上操作将不起作用或无法编译。有效的方法是

doSomething(Collection<? extends Base> c)

doSomething(收集在实践中,
几乎从未单独使用过。通配符在
扩展
超级
中很有用。如果我没记错的话,ArrayList只是ArrayList的缩写,ArrayList从未单独使用过。可能的重复我试图给你一个例子,可以帮助你理解。如果你还有更多问题,请告诉我原始类型和具有通配符参数的类型之间有更多的区别。例如,您可以将对象添加到原始ArrayList,但不能添加到
ArrayList
@newacct:我不认为这是真的。虽然我现在没有可用的Java环境,但将对象添加到
ArrayList
在Groovy Con上似乎效果很好sole:这在Java(producer extends,consumer super)中不应该起作用。此外,您甚至不能使用
new ArrayList()
在Java中,所以Groovy可能有点different@newacct:我有机会使用Java环境,看起来你在这两方面都是对的。观察结果非常好。那么,这是一种在编译时以只读列表的方式运行的聪明方法吗?但是,再说一次,它有什么用呢,因为你无法将任何数据输入其中?!作为推论:如果你收藏