I have the setup:
public abstract class AbstractDbManager {
public abstract boolean createTable();
public abstract int insert(Stockable rm);
public abstract Stockable get(String key);
public abstract int save(Stockable rm);
}
public interface Stockable {
}
public class Stock implements Stockable{
}
public class StockDbManager extends AbstractDbManager{
@Override
public boolean createTable() {
return true;
}
@Override
public int insert(Stock stk) {
return 0;
}
@Override
public Stock get(String key) {
return null;
}
@Override
public int save(Stock stk) {
return 0;
}
}
Why wont the methods: int insert(Stock stk)
and int save(Stock stk)
in StockDbManager
override the methods:
abstract int insert(Stockable rm);
and abstract int save(Stockable rm);
in AbstractDbManager
despite the fact that every Stock
is also a Stockable
?
Note however that Stock get(String key)
method in StockDbManager
successfully overrides the abstract Stockable get(String key);
method in AbstractDbManager
.
The method insert(Stockable)
requires that it accepts all implementations of Stockable
, and your implementation does not satisfy that requirement of the contract: it only accepts a specific implementation of Stockable
(ie Stock
).
For return values this works different: Stockable get(..)
says it will return a Stockable
, and given Stock
is a Stockable
, narrowing it down in the implementation to Stock get(..)
is acceptable as it fulfills the contract.