6

在 java 网站的教程页面上的这个例子中。两个接口定义了相同的默认方法startEngine()。一个类实现了这两个接口,并且由于明显的冲突FlyingCar而必须重写。startEngine()

public interface OperateCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}
public interface FlyCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}

public class FlyingCar implements OperateCar, FlyCar {
    // ...
    public int startEngine(EncryptedKey key) {
        FlyCar.super.startEngine(key);
        OperateCar.super.startEngine(key);
    }
}

我不明白为什么 from用于指代in和接口FlyingCar的两个版本。据我了解,没有在任何超类中定义,因此不应被称为常驻类。我也没有看到两个接口之间的任何关系superstartEngine()OperateCarFlyCarstartEngine()superFlyingCar

4

2 回答 2

7

当您有一个实现多个接口的类,并且这些接口包含具有相似方法签名的方法时(例如您的 startEngine 方法)。

为了知道您指的是哪种方法,您可以:

yourInterface.super.method();

您可以查看此链接,该链接也解决了您的问题。

所以,你也可以这样做:

public class FlyingCar implements FlyCar, OperateCar{
    public int startEngine(EncryptedKey key) {
        return FlyCar.super.startEngine(key);
    }
}

或这个:

public class FlyingCar implements FlyCar, OperateCar{
    public int startEngine(EncryptedKey key) {
        return Operate.super.startEngine(key);
    }
}

无论哪种方式,如果您只是从接口调用方法,则必须指定从中调用方法的接口。

但是,这种特殊情况是一个例子,这是有原因的。更有可能发生的是您将执行以下操作:

public int startEngine(EncryptedKey key) {
    // Custom implemenation...
}

这也是有效的。但是,如果您有两个接口的方法具有相同的签名,这也可能是您应该有一个声明该方法的父接口和扩展它的两个子接口的情况:

public interface Car {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Default implementation
};
}

public interface FlyCar extends Car {
    // Methods unique to FlyCar
}

public interface OperateCar extends Car {
    // methods unique to OperateCar
}
于 2015-10-18T07:05:32.890 回答
5

据我了解, startEngine() 没有在任何超类中定义,因此不应被称为常驻类。

是的,它被定义了。这是默认实现,例如:

public interface OperateCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}

OperateCar.super.startEngine(key)将执行默认实现。

如果没有默认实现,只有一个接口方法,那么该语句就没有意义,因为接口不包含实现,如下所示:

public interface OperateCar {
    // ...
    int startEngine(EncryptedKey key);
}

我也没有看到 super 和 FlyingCar 中实现的两个接口之间的任何关系

不知道我明白你在问什么。 super是一种在父接口中调用实现的方法。没有super,就没有其他方式来表达这一点。

于 2015-10-18T07:04:34.267 回答