我有两个问题
1.下面两个声明有区别吗?
(案例一)
List<String> li = new ArrayList();
(案例二)
List<String> li = new ArrayList<String>();
2.我知道泛型的好处是编译时更强的类型检查
。
那为什么我们需要像 case ii
那样声明?
由于对象创建是在运行时仅在编译时声明。
最佳答案
执行 的代码没有区别 - 但第一个表单会生成警告。 如果您没有为泛型启用 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 generics FAQ了解更多详情。
关于java - 这些通用类型之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17894892/