列表
但是,以下示例编译时没有任何警告:
List
我很好奇为什么需要介绍钻石操作员。如果类型参数不存在,为什么不对构造函数进行类型推断(就像它已经在java中为静态方法所做的那样,并被像谷歌番石榴这样的集合库所利用)
编辑:使用millimoose answer作为起点,我了解了擦除实际上是什么类型,它不仅仅是删除所有类型信息。编译器实际上做了更多的工作(从官方文档复制):
如果类型参数是无界的,则用它们的边界或Object替换泛型类型中的所有类型参数。因此,生成的字节码只包含普通的类、接口和方法。
如果需要,插入类型转换以保持类型安全。
- 生成桥接方法以保留扩展泛型类型中的多态性。
Java开发人员非常努力地避免改变现有程序的行为<代码>列表
============================================================================
经过进一步的考虑和@millimoose的评论,我发现行为的更改将是初始化程序的本地更改,并在编译时检测到。考虑以下程序:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
List<Integer> integers = new ArrayList<Integer>();
integers.add(Integer.valueOf(3));
integers.add(Integer.valueOf(4));
List<String> list = new ArrayList(integers);
System.out.println(list);
}
}
在没有类型推断的情况下,它运行并打印[3,4]
,尽管存在列表的不良情况
使用类型推断,它将不会编译,因为
ArrayList(集合
最终的答案必须来自设计该特性的人,但我假设这是为了将其与使用原始类型区分开来,原始类型使编译器为了兼容性而做一些完全不同的事情。带有原始类型的表达式与涉及泛型的表达式处理方式微妙地不同,在这个SO问题中可以找到一个例子:泛型会破坏非相关的集合
考虑这个java代码,它试图实例化一些<代码>列表< /C> 和很简单;在Java7中使用新的菱形运算符来减少类型参数的不必要重复。 是使用匿名类的的变体,可能会重写的某些方法。 试图使用菱形运算符,类似于list2,但这是一个编译错误 产生一个错误,证明编译器知道实际需要什么类型。错误消息是类型不匹配:无法从新ArrayList转换 那么,有了的声明,为什么菱形运算符不能与匿名类一起使用呢?这里
问题内容: 我有一个类型为Patient_class的arraylist,并且用黄色下划线标出了arraylist类型,IDE提到了“新表达式中的冗余类型参数(使用菱形运算符)”。 我的问题是:我应该改用菱形运算符吗?是必须的吗?将记录存储到arraylist时,是否会丢失数据或出现其他任何问题? 这是我的数组列表: 老实说,我不知道钻石经营者实际上是什么。 问题答案: Diamond运算符的目的
问题内容: 我读到从Java 7开始,像在第一条语句中那样在右侧指定类型来创建Collections是不好的样式,因为编译器可以从左侧推断类型。 我的问题是,当像这样初始化列表时,编译器找不到类型,并且我收到未经检查的类型警告: 问题答案: 编译器不会 推断 类型,因为您正在实例化 raw 。但是它足够聪明,可以警告您在使用此(原始)对象时可能会出现问题。 值得一提的是此警告背后的原因。由于类型擦
问题内容: 将导致编译器警告。 但是,以下示例在编译时没有任何警告: 我很好奇为什么根本需要引进钻石操作员。如果不存在类型参数,为什么不对构造函数进行类型推断(因为它已经在Java中的静态方法中完成,并被Google guava等集合库所利用) 编辑 :使用millimoose答案作为起点,我了解了实际上是什么类型的擦除,而不仅仅是删除所有类型的信息。编译器实际上做了更多(从官方文档复制): 如果
问题内容: Java 7中的菱形运算符允许如下代码: 但是,在Java 5/6中,我可以简单地编写: 我对类型擦除的理解是这些完全相同。(无论如何,泛型都会在运行时删除)。 问题答案: 是在左侧,你使用的是通用类型,而在右侧,你使用的是原始类型LinkedList。Java中的原始类型实际上仅存在于与前泛型代码的兼容性,并且除非绝对必要,否则绝对不能在新代码中使用。 现在,如果Java从一开始就具
从JEP 286中,我们可以在JDK 10(18.3)中利用本地类型推断()。JEP声明将进行以下编译,这是预期的: 谢谢!