先看一段代码
public class Father {
void test(Object o){}
}
class Son<T> extends Father{
void test(T o){}//编译错误!
}
这段代码会报一个编译错误,both methods have same erasure, yet neither overrides the other。
这个错误的意思是,两个方法在类型擦除后,具有相同的原生类型参数列表,但是也不能覆盖另一个方法。
泛型类型在编译后,会做类型擦除,只剩下原生类型。如参数列表中的T类型会编译成Object,但是会有一个Signature。
尽管两个test方法具有相同的字节码,但是类型参数信息用 一个新的签名(signature) 属性记录在类模式中。JVM 在装载类时记录这个签名信息,并在运行时通过反射使它可用。
这就导致了这个方法既不能作为覆盖父类test方法的方法,也不能作为test方法的重载。
本文探讨了Java泛型在实现方法覆盖时遇到的问题:当子类方法试图覆盖父类的非泛型方法时,由于类型擦除导致的编译错误。文章详细解释了这一现象背后的原因,并介绍了如何正确理解和使用泛型。
6606





