java:用类型化方法重写泛型方法?

axzmvihb  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(423)

我有一个父类入口点和一个抽象方法来检索一个属性,它是一个泛型类型的列表。列表被声明为受保护:

public abstract class EntryPoint implements Serializable {

    public EntryPoint(){}

    protected ArrayList<? extends Tag> tiedTags;

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

}

我有一个子类代表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; }
}
dgtucam1

dgtucam11#

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

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; }
}

这时就不再需要演员了。

bxfogqkk

bxfogqkk2#

重写的方法不是泛型方法;泛型方法声明自己的类型变量。
中的覆盖 SNMPEntryPoint 是协变覆盖;允许子类重写超类中的方法,以返回比重写方法中的返回类型更具体的类型(原始类型的子类型),例如:

interface Factory {
    Object make();
}

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

ArrayList<SNMPTag> 是的子类型 ArrayList<? extends Tag> ,您的示例是一个有效的(尽管不常见)协变重写。
没有相应的特性来重写参数类型不太具体的方法。

相关问题