【问题标题】:Java Class cannot override method in abstract class which has a method signature that contains an interfaceJava 类不能覆盖具有包含接口的方法签名的抽象类中的方法
【发布时间】:2020-11-08 20:20:55
【问题描述】:

我有设置:

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;
    }
    
  
}

为什么方法:int insert(Stock stk)int save(Stock stk) in StockDbManager 不会覆盖方法:

abstract int insert(Stockable rm);abstract int save(Stockable rm);AbstractDbManager 尽管事实上每个 Stock 也是一个 Stockable

但是请注意,StockDbManager 中的 Stock get(String key) 方法成功地覆盖了 AbstractDbManager 中的 abstract Stockable get(String key); 方法。

【问题讨论】:

    标签: java oop inheritance interface abstract-class


    【解决方案1】:

    insert(Stockable) 方法要求它接受Stockable所有 实现,而您的实现不满足合同的要求:它只接受Stockable 的特定实现(即Stock)。

    对于返回值,它的工作方式不同:Stockable get(..) 表示它将返回 Stockable,并且给定 StockStockable,在实现中将其缩小到 Stock get(..) 是可以接受的,因为它履行了合同.

    【讨论】:

    • 感谢您的回答。我敢说,在仅接受 Stockable 的特定实现的同时使其工作的唯一方法是在 insert 和 save 方法中使用 instanceof 运算符以及强制转换,对吗?还是有更惯用的方式?
    • @gbenroscience 当实现不是Stock 时抛出异常(或什么都不做)将是接口契约的一个相当糟糕的实现,并且表明您的某些东西不正确设计。对我来说,这建议要么你需要改变你的界面以使用Stock而不是Stockable,或者你需要在保存时将Stockable的其他实现转换为Stock
    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多