[英]Generic within method declaration
假设我有一个抽象类,它有这个抽象方法
removeItem(GeneralItem item, String reason);
但后来我在一个子类中
removeItem(SpecificItemThatExtendsGeneralItem item, String reason){ //code }
我该怎么做才能使第二个removeItem算作第一个的实现? 例如
removeItem(<? extends GeneralItem> item, String reason);
一种有签名的方法......
removeItem(SpecificItemThatExtendsGeneralItem item, String reason)
...... 没有实施......
removeItem(GeneralItem item, String reason)
...因为后者可以接受任何GeneralItem
,包括那些不是SpecificItemThatExtendsGeneralItem
。
但是,如果您可以更改抽象类,那么您可以使其成为可能:
abstract class MyAbstractClass <T extends GeneralItem> {
abstract public void removeItem(T item, String reason);
}
class MySubclass extends MyAbstractClass<SpecificItemThatExtendsGeneralItem> {
@Override
public void removeItem(SpecificItemThatExtendsGeneralItem item,
String reason) {
// ...
}
}
但是,在这种情况下,请注意MySubclass
类型仍然与MyAbstractClass<GeneralItem>
不兼容:
MyAbstractClass<GeneralItem> = new MySubclass(); // ERROR
虽然它与MyAbstractClass<?>
和MyAbstractClass<SpecificItemThatExtendsGeneralItem>
兼容:
MyAbstractClass<?> c = new MySubclass(); // ok
MyAbstractClass<SpecificItemThatExtendsGeneralItem> = new MySubclass(); // ok
如果可以更改基类,则可以概括第一个参数:
class BaseClass<T extends GeneralItem> {
void removeItem(T item, String reason) {
}
}
class SubClass extends BaseClass<SpecificItemThatExtendsGeneralItem> {
@Override
void removeItem(SpecificItemThatExtendsGeneralItem item, String reason) {
}
}
子类不能更改它们在方法中接受的类型。 但你绝对可以检查类型是否符合预期:
removeItem(GeneralItem item, String reason)
{
if (!(item instanceof SpecificItemThatExtendsGeneralItem))
throw InvalidArgumentException("Only SpecificItemThatExtendsGeneralItem accepted");
}
但是,在编译期间不会检查这一点,只是因为当有人打电话时
abstractClassInstance.removeItem(OtherSpecificItemThatExtendsGeneralItem)
编译器无法知道这应该失败,它不知道abstractClassInstance
实际上是哪个实现。
这是不可能的。
方法:
removeItem(SpecificItemThatExtendsGeneralItem item, String reason){ //code }
并未涵盖调用您希望覆盖的方法的所有有效方法。 因此,拥有一个(只)实现此方法的类不符合父类的约定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.