A method having signature ...
removeItem(SpecificItemThatExtendsGeneralItem item, String reason)
... does not implement ...
removeItem(GeneralItem item, String reason)
... because the latter can accept any GeneralItem, including those that are not SpecificItemThatExtendsGeneralItem.
If you can alter the abstract class, however, then you can make it possible:
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) {
// ...
}
}
In that case, however, note that type MySubclass is then still incompatible with MyAbstractClass<GeneralItem>:
MyAbstractClass<GeneralItem> = new MySubclass(); // ERROR
though it is compatible with MyAbstractClass<?> and MyAbstractClass<SpecificItemThatExtendsGeneralItem>:
MyAbstractClass<?> c = new MySubclass(); // ok
MyAbstractClass<SpecificItemThatExtendsGeneralItem> = new MySubclass(); // ok