第一种情况
interface A
{
   int m();
   void others(); 
}interface B 
{
   void m();
   void anthers(); 
}class Test implements A , B 
{
     //这里对m()如何处理才行? 假设上面的情况在某个已经完成的项目中真的存在了!!!         void others() {     }
     void anthers() {    }
}第二种情况
interface A
{
   void m();
   void others(); 
}interface B 
{
   void m();
   void anthers(); 
}class Test implements A , B 
{
     //这里对m()这样做是可以的,但怎么知道他重写的是哪一个接口的void m()呢?请说说程序本身的处理过程。   
     void m() {     }
     void others() {    }
     void anthers() {     }
}
我知道上面的问题网上有不少相关的解答,但不能令人满意。希望哪位能来讲解透彻些,令大家信服。

解决方案 »

  1.   

    我晕,格式不好。重发。
    第一种情况 Java codeinterface A
    {
       int m();
       void others(); 
    }interface B 
    {
       void m();
       void anthers(); 
    }class Test implements A , B 
    {
         //这里对m()如何处理才行? 假设上面的情况在某个已经完成的项目中真的存在了!!!         void others() {     }
         void anthers() {    }
    }
    第二种情况 Java codeinterface A
    {
       void m();
       void others(); 
    }interface B 
    {
       void m();
       void anthers(); 
    }class Test implements A , B 
    {
         //这里对m()这样做是可以的,但怎么知道他重写的是哪一个接口的void m()呢?请说说程序本身的处理过程。   
         void m() {     }
         void others() {    }
         void anthers() {     }
    }
      

  2.   

    第一种情况 interface A 

      int m(); 
      void others(); 
    } interface B 

      void m(); 
      void anthers(); 
    } class Test implements A , B 

        //这里对m()如何处理才行? 假设上面的情况在某个已经完成的项目中真的存在了!!!        void others() {    } 
        void anthers() {    } 

    第二种情况 interface A 

      void m(); 
      void others(); 
    } interface B 

      void m(); 
      void anthers(); 
    } class Test implements A , B 

        //这里对m()这样做是可以的,但怎么知道他重写的是哪一个接口的void m()呢?请说说程序本身的处理过程。  
        void m() {    } 
        void others() {    } 
        void anthers() {    } 

      

  3.   

    在实现类中实现m方法,实际把两个接口中得到的m方法都实现了。
    这种情况的确存在。
    LinkedList类中的add方法就是来自多个接口:
    public boolean add(E e)将指定元素添加到此列表的结尾。 
    此方法等效于 addLast(E)。 
    指定者:
    接口 Collection<E> 中的 add
    指定者:
    接口 Deque<E> 中的 add
    指定者:
    接口 List<E> 中的 add
    指定者:
    接口 Queue<E> 中的 add
    覆盖:
    类 AbstractList<E> 中的 add
    参数:
    e - 要添加到此列表的元素 
    返回:
    true(根据 Collection.add(E) 的规定)肯定你只需要一个m方法,java也没有机制让你定义多个相同签名的方法。
      

  4.   

    void m() 实现了就可以了,就认为所有接口的void m() 都实现了.
      

  5.   

    第一种情况:
    既然Test类实现了A,B接口,就必须覆盖所有的抽象方法;
    但是两个m()是无法同时在一个类中实现的,因为它们都是无参的同名方法,所以无法进行重载:
    .....
    int m(){ }
    void m() { }  //这样写必定报错
    .....
    可以参考3楼所说的第二种情况:
    对于一个同时实现了两个都含有void m()的接口的类来说,
    它必须必须覆盖掉所有的抽象方法,而根据你所说的:
    void m() { } //可行
    void others() { } 
    void anthers() { } 
    说明:这里已经不存在“哪一个接口的void m()”这个说法,因为如果存在以上的说法,那么就代表只重写了其中一个接口的void m(),
    而这与第一种情况是矛盾的;
    再者,对于两个形式完全相同的抽象方法,根本就没有必要知道重写的是哪一个接口的void m(),没有任何意义
      

  6.   

    1、第一种情况是不允许的,因为同一个类中无法存在两个方法名相同的方法!   所以第一种情况是不可能实现的。2、相当于把两个接口的方法都实现了。引用楼上的List的例子。
      

  7.   

    恩  像ZangXT 学习果然写一个方法就实现了多个接口中相同的方法名!
      

  8.   

    接口 Deque <E> 中的 add 
    指定者: 
    接口 List <E> 中的 add 
    指定者: 
    接口 Queue <E> 中的 add他们里的ADD好像都是继承的Collection 的吧?
      

  9.   

    第1种情况,编译都无法通过!
    如果硬是有这种情况,只能绕道,比如用适配器模式:
    添加一个新的接口。代码例子如下:interface A{
    void m();
    }
    interface B{
    int m();
    }
    interface C{
    int m2();
    B getB();
    }public class Test implements A,C{
    public void m() {
    } public int m2() {
    return 0;
    } public B getB() {
    return new B(){
    public int m() {
    return m2();
    }
    };
    }
    public static void main(String[] args) {
    Test t=new TestInterface();
    B b=t.getB();//这里不能用 B b=(B)t;了!
    t.m();
    }
    }
      

  10.   

    第一种要是存在这样的情况只能说当时的设计很垃圾。既然有不同的需求名字干嘛弄一样的,而现在硬要把不同的业务拉在一个实现类里,扯淡
    不过遇到这样的设计做程序员的有什么办法,只能将错就错了,要么像25楼说的那样,引入新的接口,要么就把业务写在两个实现类里,分别调用。
    不知道写在一起目的是为了什么,分开难道就不能满足业务逻辑????
    第二种的话,接口是是负责给别人调用的,他的业务都在实现类里处理,即不管你调用的是哪个接口的方法,他最终还是执行实现类里的方法,本身没有任何意义,你想调用哪个都可以。目的只有一个。
    至于3楼的说法,24楼已经说的很清楚了,因为他们有一个共同的父类Collection,只是继承了父类的add而已。本身并没有这个接口。引用:
    24楼说:“他们里的ADD好像都是继承的Collection 的吧?”
      

  11.   

    我认为楼主的这个问题是无解的,在我写的测试代码中也说明了这一点。如果现实中出现这种情况只能说你不走运,应该改设计大家都的注意力集中在如何实现的问题上,而其实接口是为了给模块化而给其他人调用的。无论 Test 类实现接口 A 中的 m 方法还是接口 B 中的 m 方法,下面的代码都会有矛盾:A a = new Test();
    a.m();B b = new Test();
    System.out.println(b.m());
    不失一般性,如果楼主的两个接口作如下修改:
    interface A {
        java.io.InputStream m();
    }interface B {
        java.net.Socket m();
    }class Test implements A, B{
        // 如何实现省略
    }class TestClass {
        public static void main(String[] args){
            // 下面的这种情况是很不可思议的
            Test obj = new Test();
            A a = obj;
            B b = obj;
            java.io.InputSteam is = a.m();
            java.net.Socket socket = a.m();
        }
    }
      

  12.   


    我觉得这种情况存在,比如说你用到别人提供的接口?两个接口都是三方的,而恰好就出现这种情况了!
    我觉得25楼的方法好,转接口!或者,我想到的是,自己对新建一个类,先实现了其中一个接口。class C implements A{
       int m(){};
       public mC(){m();};
    }
    利用Override mC()来转
      

  13.   

    这是多继承难题的要害。
    Java的措施是,对第2种情况,简单地将两者合并;条件是不得出现第一种情况。如果两个接口都是三方的,你事实上没有办法让一个类同时实现这两个接口。这里要注意的问题是,接口隐藏了实现类的类型。
    foo(A a,B b){
       a.m();
       b.m();
    }
    既然你的实现类T对象无法同时作为A、B类型的实例,即
    T t  = new T();
    foo(t,t);//没有办法你就知道你该怎么办了。比如2个类分别实现,一个类+一个内部类。