java - Java 中的泛型声明差异

标签 java generics

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

我知道泛型可以帮助您声明 ArrayList() 具有字符串类型的对象。我的问题是 下面的和上面的有什么不同?

 List<String> v = new ArrayList();

或者下面那个和其他的不一样

List v = new ArrayList<String>();

最佳答案

List<String> v = new ArrayList();

这个在功能上并没有真正的不同。右侧的类型参数实际上并没有做任何事情。它被用作样式问题并避免使用 Raw 类型,这被认为是编程错误。事实上,在 Java 7 中它得到了增强,所以你可以这样做:List<String> v = new ArrayList<>();而不必在右侧重复自己。

List v = new ArrayList<String>();

没有类型参数的列表称为原始类型。在使用泛型的新代码中声明原始类型通常被认为是编程错误。基本上,当您以这种方式声明时,根本不会进行类型检查,您可以在该列表中放入任何内容。

Java 泛型是一种编译时检查。因此,重要的是编译时引用的类型。如果您的引用是 Raw List 类型您在右侧声明的内容无关紧要,这就是编译器将检查的内容。

List<String>并不是真正的“具有字符串的列表”。这是一个“我已经要求编译器返回错误和/或警告我的列表,如果我在那里放了一些不是字符串的东西。如果你忽略编译器警告,那完全有可能得到一些东西” t 一个字符串。

关于java - Java 中的泛型声明差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10093597/

相关文章:

java - 从 public static void main 测试 Hibernate + Spring

java - retrofit2 上没有这样的文件或目录调用响应

java - 长期均匀分布的随机数

java - GWT AsyncDataProvider 的通用列表

generics - Swift 中的通用复制函数

java - 不同版本的扩展同时运行

java - 从传入对象构造函数的 lambda 访问对象

generics - Java 的 `?` 未知通配符的 TypeScript 等价物是什么?

java - 将通配符与 Lists.partition 和嵌套泛型类型一起使用

java - 通用不匹配