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

我试过这样做:

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#那样进行显式实现 。

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

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

感谢所有的答复。

 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, 没有解决方法。

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

 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(); } } 

Java不这样做。

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

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