Java 使用泛型集合

Java 使用泛型集合,java,generics,collections,arraylist,Java,Generics,Collections,Arraylist,它的编译和运行成功 List a=new ArrayList<String>(); a.add(new Integer(5)); List a=new ArrayList(); a、 加(新整数(5)); 有人能解释一下吗?您在实际定义中没有指定泛型类型 如果你写 List<String> a = new ArrayList<String>(); a.add(new Integer(5)); List a=new ArrayList(); a、 加(新整

它的编译和运行成功

List a=new ArrayList<String>();
a.add(new Integer(5));
List a=new ArrayList();
a、 加(新整数(5));

有人能解释一下吗?

您在实际定义中没有指定泛型类型

如果你写

List<String> a = new ArrayList<String>();
a.add(new Integer(5));
List a=new ArrayList();
a、 加(新整数(5));
不会编译。

您应该这样做

List<String> a = new ArrayList<String>();
a.add(new Integer(5));
List a=new ArrayList();
a、 加(新整数(5));
  • 列表意味着编译器将检查是否只有
    String
    对象被添加到集合中
有人能解释一下吗

这是可能的,因为

  • 由于类型使用,运行时没有类型安全性
  • 语句
    lista
    意味着没有编译时检查哪些对象被添加到列表中

从java 7开始,为了类型安全,您不必编写
List a=new ArrayList()
。您可以简单地使用菱形操作符,并使用
List a=new ArrayList()实现相同的操作

列表a
是一种原始类型,没有泛型。这正是您可以向其中添加整数的原因

要强制执行正确的行为,请将列表更改为使用泛型

List<String> a
列表a

原因是您将变量
a
声明为原始列表,即
列表
没有任何关联类型:

List a = new ArrayList<String>();
被编译成:

List a = new ArrayList();
a.add("foo");
String x = (String) a.get(0);

类似地,您的代码:

List a = new ArrayList<String>();
a.add(new Integer(5));
因此,不会生成编译或运行时错误

但是,当您尝试从列表中获取项目时,您会注意到差异:

int i = a.get(0); // compilation error due to type mismatch
这是因为您的列表被声明为原始类型。为了避免此错误,您需要使用泛型来声明列表,或者执行如上所述的类型转换。i、 e

在列表中使用泛型类型:

List<Integer> a = new ArrayList<Integer>();
a.add(new Integer(5));    
int i = a.get(0);
List a=new ArrayList();
a、 加(新整数(5));
int i=a.get(0);
或者执行此铸造:(不推荐使用

List a=new ArrayList();
a、 加(新整数(5));
int i=(整数)a.get(0);

PS:请注意,在运行时无法找到特定类型,例如用于声明列表对象的字符串。

编译后,将删除泛型数据。这意味着

List<String> a=new ArrayList<String>();
现在回答您的问题,
a
的类型是
List
,它是原始列表,您可以向其添加任何内容。泛型用于设置编译时限制。也就是说你有

List<String> a=new ArrayList<String>();

这是因为旧的遗留代码被允许放置任何东西(除了 原语)添加到集合中。为了支持遗留代码,Java5和Java6 允许较新的类型安全代码使用较旧的代码

因此,Java5或Java6编译器被迫让您编译新类型 安全的代码,即使您的代码调用了采用 非类型安全参数,谁知道用它做什么


事实上,编译器会警告你。编译器从编译中生成了一个完全有效的类文件,但它很好心地告诉你,用这么多的话来说,“我真的希望你知道你在做什么,因为这段旧代码没有尊重(甚至没有知识)你的
打字,并且可以对你宝贵的
数组列表做任何它想做的事。

我知道,谢谢。我想知道为什么它运行时没有任何异常它运行时没有异常,因为ArrayList在引擎盖下使用对象[]来存储数据,而Integer是Object的子类
List<Integer> a = new ArrayList<Integer>();
a.add(new Integer(5));    
int i = a.get(0);
List a=new ArrayList<Date>();
a.add(new Integer(5));
int i = (Integer) a.get(0);
List<String> a=new ArrayList<String>();
List a=new ArrayList();
List<String> a=new ArrayList<String>();
a.add(new Integer(1)); //error