0

如果我有一个扩展 MySuperClass 的子类,并且我有以下泛型类:

public class GenericClass<M extends MySuperClass>{

    public void aMethod(M m);

}

public class SubClass1 extends MySuperClass{}

然后我做:

SubClass1 sc1 = new SubClass1();

GenericClass<MySuperClass> msc = new GenericClass<MySuperClass>();

msc.aMethod(sc1);

是确定参数化类型是否合法的类型擦除?我认为编译器可以查看M extends MySuperClass、查看并确定其合法性——但我不确定类型擦除是否处理了这个问题?

4

4 回答 4

4

类型擦除是指在编译后删除泛型类型参数和实例化的事实。编译器在编译时检查类型,然后删除所有类型参数。

于 2012-08-14T19:57:24.827 回答
3

编译器是基于代码中的泛型定义确保类型安全的编译器。

类型擦除会在编译和

如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或 Object

.

于 2012-08-14T19:55:05.750 回答
1

类型安全是由编译器确保的。类型擦除的唯一工作是擦除泛型部分,以使代码向后兼容在泛型出现在 Java 中之前编写的遗留代码。因此,在擦除生效之前,是编译器确保您的代码在语法上是正确的,无论它是否与泛型相关。

于 2012-08-14T20:00:45.213 回答
1

当所有类实际上都是“原始”(无类型)时,类型擦除是一种运行时人工制品。

泛型仅在编译期间存在。编译器检查泛型参数是否在界限内,但编译后的字节码没有类型信息。

于 2012-08-14T20:03:40.890 回答