当覆盖方法遇到问题时:
public interface IProduct {
public void sendMessage(Object object);
}
@Service
public class ProductManagere implements IProduct{
@Override
public void sendMessage(Product product) {
// Added logic
}
}
但要注意以下事项:
ProductManagere类型的sendMessage(Product)方法必须重写或实现超类型方法
我不明白为什么抛出此异常。我希望product是Object的子类型,因此它不会引发异常。
答案 0 :(得分:9)
在Java中,重载不允许参数的协方差。
仅适用于返回类型。
为什么呢
因为更改子类中方法参数的类型的目的不是覆盖方法,而是重载。这不是您的意图。
因此,要么必须将Object
保留为子类中的参数(可能不是您想要的),要么使该接口成为通用接口,例如:
public interface IProduct<T> {
void sendMessage(T object);
}
以及子类:
@Service
public class ProductManagere implements IProduct<Product>{
@Override
public void sendMessage(Product product) {
// Added logic
}
}
答案 1 :(得分:2)
这在Java中是不允许的。您必须使用泛型。
public interface IProduct<T> {
public void sendMessage(T object);
}
服务:
@Service
public class ProductManagere implements IProduct<Product> {
@Override
public void sendMessage(Product product) {
// Added logic
}
}
或者,更改界面中的方法以匹配Product
。
public void sendMessage(Product object);
答案 2 :(得分:0)
如果您的假设正确,那么在以下情况下会发生什么:
IProduct prod = new ProductManager();
prod.sendMessage("String is a subclass of Object too");
使接口通用,即可正常工作。
答案 3 :(得分:0)
必须完全相同,因为LSP可能会中断。但是,您可以使用泛型对类型保护进行相同的操作。