java - 如何更改实现接口(interface)的继承类的参数?

标签 java inheritance interface

我有一个接口(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){}
}

我想重写 PostgreSQLDocumentDAOinsert 方法,将参数从 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)

最佳答案

这里有两个选项。

  1. 您可以修改 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/

相关文章:

java - 如何处理获取相同文件的两个扫描仪

c++ - 是否可以颠倒破坏顺序?

interface - 在 OCaml 中使用仿函数作为接口(interface)

inheritance - Go - 如何明确声明一个结构正在实现一个接口(interface)?

Java接口(interface)扩展题

java - JSlider 不调整形状大小

java - 使用 Jersey 的 JAXRS Rest 服务中的问题

java - 仅尝试互联网连接几秒钟

Ruby 错误处理 : Rescuing Exceptions in Subclasses

c++ - 愚蠢的 C++ 语法尚未声明