在扩展接口中覆盖返回类型 - 坏主意?

2022-09-03 13:58:56

在Java中,您可以执行以下操作:

public interface IEngine{}
public interface ICoolEngine extends IEngine{}

public interface Car
{
   IEngine getEngine();
}
public interface ICoolCar extends ICar
{
    @Override
    ICoolEngine getEngine();
}

虽然这很好地解决了我一直在努力解决的问题,但有些事情“感觉”是错误的。

我在这里犯了一些令人讨厌的设计错误吗?


答案 1

不,你正在做正确的事情。协变返回仅指定类及其下的类必须返回父类返回的原始常规类参数的特定子类。这也意味着你的子类仍然与原始接口兼容,该接口要求它返回引擎,但是如果你知道它是一个ICoolCar,那么它有一个ICoolEngine - 因为更具体的接口知道更具体的功能。这适用于接口和类 - 这是正确的,适当的和有用的引导。


答案 2

不,没关系。由于 extends ,任何对象实现都可以被视为一个(当然没有所有特定于的方法)。您只需要了解类型差异,具体取决于您在每种情况下使用的接口,并确保不使用未定义的方法(假设在您的实际代码中,还有其他方法列在等效项中)。ICoolEngineIEngineICoolEngineIEngineICoolEngineICoolEngineIEngineICoolEngine

这样做并不是一个坏习惯;你只是在使用多态性的力量。