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

本文关键字:显式接口实现 是否 支持 Java | 更新日期: 2023-09-27 18:33:29

我尝试这样做:

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#这样的显式接口实现。但对于无法避免的情况,霍尔格的委托方法似乎是出路。

感谢您的所有回复。

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

这种问题的标准解决方案是使用委派:

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不会这样做。

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

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

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