import java.util.*;
class Parent {
public void m1(List list)
{
System.out.println("父类");
}
}
class Baby extends Parent {
public void m1(List list)
{
System.out.println("子类");
}
}
class OverrideTest {
public static void main(String[] args) {
}
}
方法m1的签名的擦除相同但是不能覆写,求解答
原因就在于这两个方法无论重载还是重写,泛型擦除了就是一样的方法了。你想想,同一个类里面可能有两个完全一样的方法吗,不可以是吧
因为擦除之后就是一样的啊 你不是问过的么
方法m1的签名的擦除相同?
擦除还是参数?
[quote]
override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
[/quote]
而你两个方法的参数并不一致吧,应该算是重载吧。
参数类型不同,导致不能复写。
这完全是编译器层面的检测。
编译器知道这两个方法是父子类,方法名一样,因为泛型擦除的关系,参数类型最终也会一样,都是个List,按理说这应该是覆盖,但编译器有自己的职责,要保证泛型类尽可能不出现类型转换错误(泛型也就在编译期起类型保护用),这个“覆盖”很显然会带来多态调用的类型转换错误,所以就导致这段代码编译通不过