java - Java 类不能覆盖具有包含接口的方法签名的抽象类中的方法
问题描述
我有设置:
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)
覆盖StockDbManager
方法:
abstract int insert(Stockable rm);
abstract int save(Stockable rm);
尽管AbstractDbManager
每一个也是Stock
一个Stockable
?
但是请注意, Stock get(String key)
方法 in成功StockDbManager
地覆盖了.abstract Stockable get(String key);
AbstractDbManager
解决方案
该方法insert(Stockable)
要求它接受的所有实现Stockable
,而您的实现不满足合同的要求:它只接受Stockable
(ie Stock
) 的特定实现。
对于返回值,它的工作方式不同:Stockable get(..)
说它将返回 a Stockable
,并且给定Stock
是 a Stockable
,在实现中将其缩小到Stock get(..)
是可以接受的,因为它履行了合同。
推荐阅读
- python - 是否有读取 ms office 文件的底层 xml 的 python 包?
- javascript - 使用 post 方法获取附加输入字段的值
- java - 是否可以将类文件从包外部扩展到包
- java - 如何设置千位分隔符并返回双精度值?
- jsp - Struts2 的 TilesPlugin 没有加载到现有的 Struts1 项目中
- ruby-on-rails - 如何在rails 5中自动增加字符串发票编号
- python - SQLite:在打印 Python 时去掉 , 和 ()
- css - Shiny App 不再链接到 www 文件夹(CSS 和图像)
- c# - 无法将程序集引用添加到控制台应用程序
- vue.js - Vuex, Vuejs if 语句为真,什么也不做