Search code examples
javaoopinheritanceinterfaceabstract-class

Java Class cannot override method in abstract class which has a method signature that contains an interface


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.


Solution

  • 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.