方法声明中的通用

时间:2015-02-11 20:47:04

标签: java generics

假设我有一个抽象类,它有一个抽象方法

removeItem(GeneralItem item, String reason);

然后在子类中我有

removeItem(SpecificItemThatExtendsGeneralItem item, String reason){ //code }

如何使第二个removeItem计为第一个的实现? e.g

removeItem(<? extends GeneralItem> item, String reason);

4 个答案:

答案 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 }

未涵盖调用您希望覆盖的方法的所有有效方法。因此,拥有一个(只)实现此方法的类不符合父类的契约。