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编译器可能会对其进行优化。(请参见第二个链接。)