我很难理解解释接口继承的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
的其他实现一起设置的能力。因此,这是不允许的。