Java 类型擦除后的类型安全?
我正在学习类型擦除。 我知道在类型擦除之后,泛型类型要么成为对象,要么成为上界。 但是,如果泛型类型成为对象,那么类型安全性不会丢失吗 例如,在下面的示例中:-Java 类型擦除后的类型安全?,java,Java,我正在学习类型擦除。 我知道在类型擦除之后,泛型类型要么成为对象,要么成为上界。 但是,如果泛型类型成为对象,那么类型安全性不会丢失吗 例如,在下面的示例中:- List<String> a = new ArrayList<String>(); a.add(10) // I can't do this, but after type erasure the generic type becomes object so where is the
List<String> a = new ArrayList<String>();
a.add(10) // I can't do this, but after type erasure the generic type becomes object so where is
the check for the type?
List a=new ArrayList();
a、 add(10)//我不能这样做,但是在类型擦除之后,泛型类型变成object,所以在哪里
检查类型?
任何帮助都将不胜感激检查将在编译时进行。如果编译程序示例,则会出现以下错误:
error: no suitable method found for add(int)
a.add(10);
^
method Collection.add(String) is not applicable
(argument mismatch; int cannot be converted to String)
method List.add(String) is not applicable
(argument mismatch; int cannot be converted to String)
这表明
列表
不允许您添加int,因为它不是字符串,不能转换为字符串。泛型类型保证编译时的类型安全。因此,只要我们不强制转换,我们就不需要在运行时使用类型安全性,因为它是在编译时验证的。但是我有一个.add(10)作为检查发生在哪里的列表?编译器进行检查并说您的代码无效。因此,您无法构建和运行它。您的IDE可能会报告相同的内容。。。在add(…)
-方法的参数上,因为它绑定到T
,即String
,并且int
和整数都不能分配给字符串
。请记住:此检查由编译器完成,而不是运行时。事实上,泛型类型安全是由编译时和运行时的组合来维护的。通常,Java编译器检测类型错误;e、 在你的例子中。但是,如果代码使用原始类型和/或不安全的转换,则类型安全性将通过运行时检查来维护。例如,在String中,s=list.get(0)
存在一个将get
的结果转换为字符串的隐式类型转换。您应该将类文件中的隐式类型转换视为checkcast
指令。。。但是JIT编译器可能会对其进行优化。(请参见第二个链接。)