Java: 用类型化方法覆盖泛型方法?

Java: Overriding Generic Method with Typed Method?

我有一个父 class 入口点,它有一个抽象方法来检索作为泛型列表的道具。该列表声明为受保护:

public abstract class EntryPoint implements Serializable {

    public EntryPoint(){}

    protected ArrayList<? extends Tag> tiedTags;

    public abstract ArrayList<? extends Tag> getTiedTags();

}

我有一个子 class 代表 SNMP 入口点(用于查询 SNMP 代理)。 IntelliJ 没有抱怨这个配置,但我想知道,我是否正确地覆盖了父方法的 getTiedTags() 方法,或者我是否以某种方式覆盖了父方法?

public class SNMPEntryPoint extends EntryPoint implements Serializable {

    //Default Constructor for Serialization
    public SNMPEntryPoint(){}

    @Override
    public ArrayList<SNMPTag> getTiedTags(){ return (ArrayList<SNMPTag>) tiedTags; }
}

您覆盖的方法不是泛型方法;泛型方法声明它自己的类型变量。

SNMPEntryPoint 中的覆盖是 协变覆盖;允许子类将超类中的方法覆盖为 return 比覆盖方法中的 return 类型更具体的类型(原始类型的子类型),例如:

interface Factory {
    Object make();
}

class StringFactory implements Factory {
    @Override
    String make() { ... }
}

由于 ArrayList<SNMPTag>ArrayList<? extends Tag> 的子类型,您的示例是有效的(尽管不常见)协变覆盖。

没有相应的功能来覆盖参数类型不太具体的方法。

更简洁的方法可能是在 class 级别引入类型参数

public abstract class EntryPoint<T extends Tag> implements Serializable {

    public EntryPoint(){}

    protected ArrayList<T> tiedTags;

    public abstract ArrayList<T> getTiedTags();

}

然后通过

继承
public class SNMPEntryPoint extends EntryPoint<SNMPTag> implements Serializable {

    //Default Constructor for Serialization
    public SNMPEntryPoint(){}

    @Override
    public ArrayList<SNMPTag> getTiedTags(){ return tiedTags; }
}

此时不再需要强制转换。