如何从实现接口的继承类更改参数?

时间:2012-03-31 14:41:36

标签: java inheritance 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 方法,将参数从文档更改为 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}}。

2 个答案:

答案 0 :(得分:3)

这里有两个选择。

  1. 您可以修改PostgreSQLDocumentDAO
  2. 然后将其更改为

    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并执行您需要的操作。

当然,假设您无法更改接口/类