java是否支持像c#这样的显式接口实现?

时间:2013-10-01 08:08:55

标签: c# java interface

我试过这样做:

interface pet {
    void sleep();
}
interface robot {
    void sleep();
}

public class roboGarfield implements pet , robot {

    /*
     * this gives error
    void pet.sleep(){

    }
    */

    @Override
    public void sleep() { System.out.println("this isn't really specific.."); }

    public static void main(String[] args){
        roboGarfield t = new roboGarfield();
        t.sleep();
        ((pet)t).sleep(); // similar to C# 
        ((robot)t).sleep();
    }    
}

但即使我可以将roboGarfeild对象转换为petrobot类型,我也不能像c#一样explicit implementation

我做错了什么?或者只是在java中不支持?

编辑:因此,java不支持像C#这样的显式接口实现。但对于无法避免的情况,霍尔格的委托方法似乎就是出路。

感谢所有回复。

3 个答案:

答案 0 :(得分:4)

这类问题的标准解决方案是使用委托:

interface pet {
    void sleep();
}
interface robot {
    void sleep();
}

public class roboGarfield {

    private final pet myPetIdentity = new pet() {
      public void sleep() { System.out.println("sleeping as pet"); }
      public String toString() { return roboGarfield.this.toString(); };
    };
    private final robot myRobotIdentity = new robot() {
      public void sleep() { System.out.println("recharging as robot"); }
      public String toString() { return roboGarfield.this.toString(); };
    };

    public final pet asPet() {
      return myPetIdentity;
    }
    public final robot asRobot() {
      return myRobotIdentity;
    }
    public static void main(String[] args){
        roboGarfield t = new roboGarfield();
        t.asPet().sleep(); 
        t.asRobot().sleep();
    }    
}

对于更大的方法,建议让内部类委托回外部类以保持内部类的简短。此外,子类可以覆盖这些方法,而无需处理委托内容。

public class roboGarfield {

    private final pet myPetIdentity = new pet() {
      public void sleep() { petSleep(); }
      public String toString() { return roboGarfield.this.toString(); };
    };
    private final robot myRobotIdentity = new robot() {
      public void sleep() { roboSleep(); }
      public String toString() { return roboGarfield.this.toString(); };
    };

    public void roboSleep()
    {
      System.out.println("recharging as robot");
    }
    public void petSleep()
    {
      System.out.println("sleeping as pet");
    }
    public final pet asPet() {
      return myPetIdentity;
    }
    public final robot asRobot() {
      return myRobotIdentity;
    }
    public static void main(String[] args){
        roboGarfield t = new roboGarfield();
        t.asPet().sleep(); 
        t.asRobot().sleep();
    }    
}

答案 1 :(得分:3)

Java不会这样做。

如果两个接口定义相同签名的方法,则无法区分它们,您只能提供将由两者使用的单个实现。

您必须注意不要以这种方式不兼容的接口结束。

答案 2 :(得分:1)

public class roboGarfield implements pet , robot {

     @ovveride
     public void  sleep(){
         //here you are implementing sleep method
         //But satisfying both pet and robot interface's sleep method.
     }

执行此操作时,在java中,单个实现适用于interface。 AFAIK, NO 解决。