java - 这些通用类型之间有什么区别

标签 java generics

我有两个问题

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/

相关文章:

java.lang.ClassNotFoundException : org. springframework.boot.SpringApplication Maven

java - Android 中的 ACTION_TIME_TICK 问题

java - 如何在 Cloud Firestore 上动态更新社交网络应用的个人资料图片 URL?

Java Generics - 预期返回类型与实际不同

java - JSP 将变量从 jsp 请求表单传递到 java 并返回到 jsp

java - C# 泛型 : How to specify type constraint and return instance of generic type

java - Collections.emptyList() 和/或 Java 泛型方法的奇怪类型推断行为?

java - Hamcrest CombinableMatcher - 通用方法无法编译

java - 如何正确使用泛型?

java - Eclipse Memory Analyzer - Leak Suspects Report 没有指向我的类 - 为什么?