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

Java 如何从实现接口的继承类更改参数?,java,inheritance,interface,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(Docum

我有一个接口和一个实现该接口的类,如下所示:

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){}
}
public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO{
    public long insert(Page doc){
        super.insertDocument(page);
        //specific implementation goes here
    }
}
我怎么能得到这个


更新:上面的代码不正确,因为名为
Inserter
的类使用接口
DocumentDAO
。当它调用insert方法时,即使是PostgreSQLPageDAO对象,它也会调用insert方法来插入文档,因为该方法是继承的

我想做一个方法,当
Inserter
类调用insert方法时,它使用插入页面的方法。这样,我想我需要覆盖
PostgreSQLDocumentDAO
中的
insert(Document doc)
两个选项

  • 您可以修改PostgreSQLDocumentDAO
  • 然后你把它改成

    public class PostgreSQLDocumentDAO<D extends Document> implements DocumentDAO<D>
    
    这里有两种选择

  • 您可以修改PostgreSQLDocumentDAO
  • 然后你把它改成

    public class PostgreSQLDocumentDAO<D extends Document> implements DocumentDAO<D>
    
    我看没有问题。
    由于
    页面
    是从
    文档
    派生出来的,因此您只需传递一个
    页面
    来代替
    文档

    如果需要在派生类的方法中进行特殊处理,可以检查
    文档
    是否为
    实例
    页面
    ,并执行所需操作

    当然,假设您不能更改接口/类

    我看不出有问题。
    由于
    页面
    是从
    文档
    派生出来的,因此您只需传递一个
    页面
    来代替
    文档

    如果需要在派生类的方法中进行特殊处理,可以检查
    文档
    是否为
    实例
    页面
    ,并执行所需操作


    当然,假设您不能更改接口/类

    我编辑了我的问题并解释了问题所在。用“汇编”的术语来说,它会起作用,但用“逻辑”的术语来说就不行了。我编辑了我的问题,解释了什么是问题。在“编译”术语中,它可以工作,但在“逻辑”术语中则不行。您要求的是让接口
    DocumentDAO
    能够根据它不知道的类型(即
    Page
    )选择方法。您描述的是多态性在Java中的工作原理。您要求的是让接口
    DocumentDAO
    能够根据它不知道的类型(即
    页面
    )选择一种方法。
    // 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);
    }