代码执行方面没有区别,但第一种形式会生成警告。如果您没有为泛型启用linting,则可能会收到以下消息:
Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
有了建议的标志,您将获得以下内容:
Test.java:6: warning: [unchecked] unchecked conversion
List<String> li = new ArrayList()
^
required: List<String>
found: ArrayList
1 warning
警告的原因是,你正在使用一个
new ArrayList()
的
原始类型表达式作为赋值给
List<String>
类型变量的值,这样做有点不安全。编译器不知道这个原始类型值是否最初就是用来保存其他值的。例如:
List numbers = new ArrayList(); // Raw types on both sides
numbers.add(Integer.valueOf(10));
List<String> li = numbers;
String first = li.get(0);
甚至可以这样做:
List<Integer> numbers = new ArrayList<Numbers>();
numbers.add(Integer.valueOf(10));
List raw = numbers;
List<String> li = raw;
String first = li.get(0);
在这两种情况下,当我们到达最后一行时会出现异常... 如果我们使用通用类型来表示所有表达式,那么它甚至不会编译:
List<Integer> numbers = new ArrayList<Numbers>();
numbers.add(Integer.valueOf(10));
List<String> li = numbers; // Compile-time error
String first = li.get(0);
原始类型仅为向后兼容而存在,在任何可能的情况下应避免使用。
有关更多详细信息,请参见Java 泛型 FAQ。