我有一个接口和一个实现这个接口的类:
public interface DocumentDAO<T>{
public long insert (T doc);
}
public class PostgreSQLDocumentDAO implements DocumentDAO<Document>{
public long insert(Document doc){}
protected void insertDocument(Document doc){}
}
我想覆盖PostgreSQLDocumentDAO
的 insert 方法,将参数从文档更改为 Page ,其中 Page 是一个扩展 Document 的类。
我想要这样的事情:
public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO{
public long insert(Page doc){
super.insertDocument(page);
//specific implementation goes here
}
}
我怎么能得到这个?
更新:上述代码不正确,因为名为Inserter
的类使用接口DocumentDAO
。当它调用 insert 方法时,即使是 PostgreSQLPageDAO 对象,它也会调用insert方法来插入 Document ,因为这个方法是继承的。
我想要在Inserter
类调用 insert 方法时,它使用插入页面的方法。这样,我认为我需要覆盖insert (Document doc)
的{{1}}。
答案 0 :(得分:3)
这里有两个选择。
然后将其更改为
public class PostgreSQLDocumentDAO<D extends Document> implements DocumentDAO<D>
和
public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO<Page>
2.您无法修改PostgreSQLDocumentDAO
然后你需要重载并覆盖PostgreSQLPageDAO中的insert方法:
// Override
@Override
public long insert(Document doc){
if (!(doc instanceof Page))
throw new IlegalArgumentException("insert only accepts Page");
super.insert(doc);
}
// Overload
public long insert(Page page){
super.insert(page);
}
答案 1 :(得分:0)
我没有看到问题
由于Page
源自Document
,因此您只需传递Page
代替Document
即可。
如果您需要在派生类的方法中进行特殊处理,则可以检查Document
是否为instanceof
Page
并执行您需要的操作。
当然,假设您无法更改接口/类