以下创建对象的方法有什么区别/后果/特征?(全部运行没有错误):
public class Solution<T> {
public static void main(String[] args) {
Solution object1 = new Solution(); //1
Solution<Integer> object2 = new Solution(); //2
Solution object3 = new Solution<Integer>(); //3
}
}
这三个都是错的。但是很难在您的示例中显示危险,您需要对其进行一些扩展:
第一个选项根本不使用泛型,而是对原始类型进行操作。首先,这将不允许编译器自动替换类型转换,它们必须手动完成。其次,编译器在操作对象时无法检查类型匹配
object1,并且字段中可能会出现Dimensionval类的实例,例如,当您的代码期望时。执行过程中会出现错误。Integer第二个选项为参数化类型的变量分配对原始类型的引用。现在编译器可以保护您免受此错误的影响
object2.setVal(new Dimension),但不能避免此错误:当将参数化类型引用分配给原始类型变量时,第三个选项会丢失类型参数。情况与前一种情况相反,编译器不会让你创建一个内容不正确的对象,但它无法检查变量操作的类型安全性: