当覆盖方法然后面临问题时

时间:2018-07-17 13:12:08

标签: java generics methods interface

当覆盖方法遇到问题时:

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的子类型,因此它不会引发异常。

4 个答案:

答案 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可能会中断。但是,您可以使用泛型对类型保护进行相同的操作。