我有一个接口(interface)和一个实现该接口(interface)的类,如下所示:
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 方法,将参数从 Document 更改为 Page,其中 < em>Page 是一个扩展 Document 的类。
我想要这样的东西:
public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO{
public long insert(Page doc){
super.insertDocument(page);
//specific implementation goes here
}
}
我怎样才能得到这个?
<小时/>更新:上面的代码不正确,因为名为 Inserter
的类使用接口(interface) DocumentDAO
。当它调用insert方法时,即使是一个PostgreSQLPageDAO对象,它也会调用insert方法来插入Document,因为这个方法是继承的。
我想做一种方法,当Inserter
类调用insert方法时,它使用插入页面的方法。这样,我想我需要覆盖 PostgreSQLDocumentDAO
中的 insert (Document doc)
。
最佳答案
这里有两个选项。
- 您可以修改 PostgreSQLDocumentDAO
然后你将其更改为
public class PostgreSQLDocumentDAO<D extends Document> implements DocumentDAO<D>
和
public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO<Page>
2.您无法修改PostgreSQLDocumentDAO
然后您需要使用以下方法重载并覆盖 PostgreSQLPageDAO 中的插入方法:
// 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);
}
关于java - 如何更改实现接口(interface)的继承类的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956856/