在java中传递后代而不是接口

die*_*tin 0 java polymorphism interface

我在 Java 中实现了两种类型的列表,一种只是标签列表,另一种在每行上提供两个按钮。

我创建了一个名为 IListView 的接口,它包含以下方法:

public void setDataSource(IListViewDataSource dataSource);
Run Code Online (Sandbox Code Playgroud)

问题在于,在创建第二种类型的列表时,它使用另一种称为IComplexListViewDataSource扩展前一种类型的数据源,并像这样实现前一种方法:

public void setDataSource(IComplexListViewDataSource dataSource);
Run Code Online (Sandbox Code Playgroud)

IntelliJ 告诉我我没有覆盖IListView接口中的方法,即使IComplexListViewDataSourceextends IListViewDataSource.

如果我是对的,如果我处理的是类而不是接口,这将毫无问题地工作。这是怎么回事,我怎样才能让它发挥作用?

rge*_*man 5

通常,要覆盖方法,无论您是处理接口还是类,签名都必须完全匹配。这包括方法中参数的确切类型。

您可以使用泛型类型参数解决此问题。

您的IListView接口可以有一个类型参数来指定采用哪种类型的参数setDataSource。您可以使用上限声明它以限制它可以是什么。

public interface IListView<T extends IListViewDataSource> {
    void setDataSource(T dataSource);
}
Run Code Online (Sandbox Code Playgroud)

实现类(或扩展接口)可以声明是什么T

public class SimpleListView implements IListView<IListViewDataSource> {
    @Override
    public void setDataSource(IListViewDataSource dataSource) {
        // Implementation
    }
}

public class ComplexListView implements IListView<IComplexListViewDataSource> {
    @Override
    public void setDataSource(IComplexListViewDataSource dataSource) {
        // Implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

始终使用@Override注释让编译器确保该方法实际上覆盖或实现了预期的方法。

此外,实现类或扩展接口可以声明自己的类型参数,并使用自己的上限应用自己的限制。

public interface IComplexListView<T extends IComplexListViewDataSource> extends IListView<T> {}
Run Code Online (Sandbox Code Playgroud)