而重写方法则面临问题

Shi*_*rty 3 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
    }
}
Run Code Online (Sandbox Code Playgroud)

但要低于例外:

ProductManagere类型的sendMessage(Product)方法必须覆盖或实现超类型方法

我不明白为什么抛出这个例外.我希望product是Object的子类型,所以它不会抛出异常.

dav*_*xxx 9

在Java中,覆盖不允许参数的协方差.
它只能用于返回类型.
为什么?因为更改子类中方法的参数类型不是为了覆盖方法而是为了重载它.这不是你的意图.

所以要么你必须Object在子类中保留参数(可能不是你想要的),要么使接口成为通用接口,例如:

public interface IProduct<T> {
    void sendMessage(T object);
}
Run Code Online (Sandbox Code Playgroud)

而子类:

@Service
public class ProductManagere implements IProduct<Product>{

    @Override
    public void sendMessage(Product product) {
        // Added logic
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但值得说明*为什么*它不接受协变参数类型. (2认同)