假设我有一个抽象类,它有一个抽象方法
removeItem(GeneralItem item, String reason);
然后在子类中我有
removeItem(SpecificItemThatExtendsGeneralItem item, String reason){ //code }
如何使第二个removeItem计为第一个的实现? e.g
removeItem(<? extends GeneralItem> item, String reason);
答案 0 :(得分:2)
具有签名的方法......
removeItem(SpecificItemThatExtendsGeneralItem item, String reason)
... 不实施......
removeItem(GeneralItem item, String reason)
...因为后者可以接受任何GeneralItem
,包括那些不是SpecificItemThatExtendsGeneralItem
的人。{/ p>
但是,如果你可以改变抽象类,那么你可以使它成为可能:
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
答案 1 :(得分:1)
如果您可以更改基类,则可以概括第一个参数:
class BaseClass<T extends GeneralItem> {
void removeItem(T item, String reason) {
}
}
class SubClass extends BaseClass<SpecificItemThatExtendsGeneralItem> {
@Override
void removeItem(SpecificItemThatExtendsGeneralItem item, String reason) {
}
}
答案 2 :(得分:0)
子类不能更改它们在方法中接受的类型。但你绝对可以检查类型是否符合预期:
removeItem(GeneralItem item, String reason)
{
if (!(item instanceof SpecificItemThatExtendsGeneralItem))
throw InvalidArgumentException("Only SpecificItemThatExtendsGeneralItem accepted");
}
但是,在编译期间不会检查这个,只是因为当有人打电话时
abstractClassInstance.removeItem(OtherSpecificItemThatExtendsGeneralItem)
编译器无法知道这应该失败,它不知道实际上是哪个实现abstractClassInstance
。
答案 3 :(得分:0)
这是不可能的。
方法:
removeItem(SpecificItemThatExtendsGeneralItem item, String reason){ //code }
未涵盖调用您希望覆盖的方法的所有有效方法。因此,拥有一个(只)实现此方法的类不符合父类的契约。