meifage
2011-08-26 10:46 阅读 201
已采纳

不能覆写

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的签名的擦除相同但是不能覆写,求解答

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • 已采纳
    AngelAndAngel AngelAndAngel 2011-08-26 11:03

    原因就在于这两个方法无论重载还是重写,泛型擦除了就是一样的方法了。你想想,同一个类里面可能有两个完全一样的方法吗,不可以是吧

    点赞 评论 复制链接分享
  • AngelAndAngel AngelAndAngel 2011-08-26 10:51

    因为擦除之后就是一样的啊 你不是问过的么

    点赞 评论 复制链接分享
  • rainbow702 rainbow702 2011-08-26 10:55

    方法m1的签名的擦除相同?

    擦除还是参数?

    [quote]
    override(重写)
    1、方法名、参数、返回值相同。
    2、子类方法不能缩小父类方法的访问权限。
    3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
    4、存在于父类和子类之间。
    5、方法被定义为final不能被重写。

    overload(重载)
    1、参数类型、个数、顺序至少有一个不相同。

    2、不能重载只有返回值不同的方法名。
    3、存在于父类和子类、同类中。
    [/quote]

    而你两个方法的参数并不一致吧,应该算是重载吧。

    点赞 评论 复制链接分享
  • zhuzhuxianghuahua007 zhuzhuxianghuahua007 2011-08-26 11:04

    参数类型不同,导致不能复写。

    点赞 评论 复制链接分享
  • freishlove freishlove 2011-08-26 11:24

    这完全是编译器层面的检测。

    编译器知道这两个方法是父子类,方法名一样,因为泛型擦除的关系,参数类型最终也会一样,都是个List,按理说这应该是覆盖,但编译器有自己的职责,要保证泛型类尽可能不出现类型转换错误(泛型也就在编译期起类型保护用),这个“覆盖”很显然会带来多态调用的类型转换错误,所以就导致这段代码编译通不过

    点赞 评论 复制链接分享

相关推荐