Java Class 无法覆盖抽象 class 中的方法,它具有包含接口的方法签名
Java Class cannot override method in abstract class which has a method signature that contains an interface
我有设置:
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;
}
}
为什么 StockDbManager
中的 int insert(Stock stk)
和 int save(Stock stk)
方法不会覆盖方法:
abstract int insert(Stockable rm);
和 AbstractDbManager
中的 abstract int save(Stockable rm);
尽管每个 Stock
也是 Stockable
?
但是请注意,StockDbManager
中的 Stock get(String key)
方法成功覆盖了 AbstractDbManager
中的 abstract Stockable get(String key);
方法。
方法 insert(Stockable)
要求它接受 Stockable
的 所有 实现,而您的实现不满足合同的要求:它只接受Stockable
(即Stock
)的具体实现。
对于 return 值,它的工作方式不同:Stockable get(..)
表示它将 return 一个 Stockable
,并且给定 Stock
是一个 Stockable
, 在实现中将其缩小到 Stock get(..)
是可以接受的,因为它履行了合同。
我有设置:
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;
}
}
为什么 StockDbManager
中的 int insert(Stock stk)
和 int save(Stock stk)
方法不会覆盖方法:
abstract int insert(Stockable rm);
和 AbstractDbManager
中的 abstract int save(Stockable rm);
尽管每个 Stock
也是 Stockable
?
但是请注意,StockDbManager
中的 Stock get(String key)
方法成功覆盖了 AbstractDbManager
中的 abstract Stockable get(String key);
方法。
方法 insert(Stockable)
要求它接受 Stockable
的 所有 实现,而您的实现不满足合同的要求:它只接受Stockable
(即Stock
)的具体实现。
对于 return 值,它的工作方式不同:Stockable get(..)
表示它将 return 一个 Stockable
,并且给定 Stock
是一个 Stockable
, 在实现中将其缩小到 Stock get(..)
是可以接受的,因为它履行了合同。