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; }
}
此时不再需要强制转换。
我有一个父 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; }
}
此时不再需要强制转换。