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

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

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

  1. public abstract class EntryPoint implements Serializable {
  2. public EntryPoint(){}
  3. protected ArrayList<? extends Tag> tiedTags;
  4. public abstract ArrayList<? extends Tag> getTiedTags();
  5. }

我有一个子类代表snmp入口点(用于查询snmp代理)。intellij并没有抱怨这种配置,但我想知道,我是否正确地重写了父级的gettiedtags()方法,还是以某种方式重写了父级方法?

  1. public class SNMPEntryPoint extends EntryPoint implements Serializable {
  2. //Default Constructor for Serialization
  3. public SNMPEntryPoint(){}
  4. @Override
  5. public ArrayList<SNMPTag> getTiedTags(){ return (ArrayList<SNMPTag>) tiedTags; }
  6. }
dgtucam1

dgtucam11#

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

  1. public abstract class EntryPoint<T extends Tag> implements Serializable {
  2. public EntryPoint(){}
  3. protected ArrayList<T> tiedTags;
  4. public abstract ArrayList<T> getTiedTags();
  5. }

然后通过

  1. public class SNMPEntryPoint extends EntryPoint<SNMPTag> implements Serializable {
  2. //Default Constructor for Serialization
  3. public SNMPEntryPoint(){}
  4. @Override
  5. public ArrayList<SNMPTag> getTiedTags(){ return tiedTags; }
  6. }

这时就不再需要演员了。

展开查看全部
bxfogqkk

bxfogqkk2#

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

  1. interface Factory {
  2. Object make();
  3. }
  4. class StringFactory implements Factory {
  5. @Override
  6. String make() { ... }
  7. }

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

相关问题