我很难理解解释接口继承的java方法,例如:

public interface Model {
    Model getModel();
    void setModel(Model model);
}

public class BaseModel implements Model {
    @Override
    public BaseModel getModel() { return  null; } // works

    @Override
    public void setModel(BaseModel model) {} // compilation error, it wants Model instead of BaseModel
}

谁能解释为什么第一种方法有效,而第二种无效?

最佳答案

为了理解这一点,您应该问自己“我是否可以继承BaseModel以使用Model接口”?

当您专门指定返回值时,这可以正常工作。即使getModel()返回BaseModel,也可以始终将其分配给Model变量。

Model model = myModel.getModel();

相反,这是不正确的:
SomeOtherModel other = ...;
myModel.setModel(other); // no problem
myBaseModel.setModel(other); // other is not a BaseModel!

如果setModel接受BaseModel参数,则将破坏它与Model的其他实现一起设置的能力。因此,这是不允许的。

07-24 18:53
查看更多