public class Test{
public static void main(String[] args){
C c1=new C();
c1.m();
}
}interface A{
void m();
}interface B{
int m();
}class C implements A,B{
public void m(){
System.out.println("void m()");
}
public int m(){
System.out.println("int m()");
}
}
以上的代码当然无法通过编译,我的问题就是,当一个类继承了多个接口,而这些接口中又有同名的方法,方法的返回又不同,因此这个类怎么实现这些方法呢。(除了改方法名有什么办法)

解决方案 »

  1.   

    public class Test{
    public static void main(String[] args){
    C c1= new C();
    c1.m();
    }
    }interface A{
    void m();
    }interface B{
    int m(int s);
    }class C implements A,B{
    private int s;
    public void m(){
    System.out.println("void m()");
    }
    public int m(int s) {
    this.s =s;
    System.out.println("int m()");
    return s;
    }
    }
    接口B是有返回类型的方法,所以需要参数,加个int s可以了
      

  2.   

    public class Test{
    public static void main(String[] args){
    C c1=new C();
    c1.m1();
    c1.m();
    }
    }interface A{
    void m1();
    }interface B{
    void m1();
    }class C implements A,B{
    public void m1(){
    System.out.println("void m()");
    }
    public void m(){
    System.out.println("int m()");
    }
    }
    这样改可能更符合作者的原意,
    其实我觉得不改应该不行,JAVA中命名本身是种艺术,达到目的就好了,何必在乎如何误导读者哩,呵呵
      

  3.   

    Java里本来就限定死了同个类中不能出现相同方法签名的多一个方法。也就是方法签名和形参必须不能完全相同
      

  4.   

    楼上的没错。实际上,Java的语义规范里明确了,方法签名包含函数名和参数列表。参数列表的位置及个数+函数名 共同决定了该函数是否是duplicated。函数的返回值不是方法签名的一部分。 不能用返回值来判定函数是否duplicated.
      

  5.   


    我把接口A中的方法改成long m(int s)的话你怎么办
      

  6.   

    回8L
    那么应该这么写
    interface D {
    void m(int s);   //m()为A、B共有的能力
    }
    interface A extends D {
    void ma();    //ma()为A特有的能力
    }
    interface B extends D {
    void mb();    //mb()为B特有的能力}
      

  7.   


    没错,孩子,这种情况在Java语言规范里是明确不支持的。