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

时间:2018-06-19 17:37:27

标签: java interface polymorphism

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

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

public void setDataSource(IListViewDataSource dataSource);

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

public void setDataSource(IComplexListViewDataSource dataSource);

IntelliJ告诉我,即使IListView扩展了IComplexListViewDataSource,我也没有覆盖IListViewDataSource界面中的方法。

如果我是正确的,那么如果我正在处理类而不是接口,这将毫无问题。发生了什么事,我如何使它正常工作?

1 个答案:

答案 0 :(得分:4)

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

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

您的IListView接口可以具有类型参数,以指定setDataSource所采用的参数类型。您可以使用上限来声明它,以限制它的大小。

public interface IListView<T extends IListViewDataSource> {
    void setDataSource(T dataSource);
}

实现类(或扩展接口)可以声明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
    }
}

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

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

public interface IComplexListView<T extends IComplexListViewDataSource> extends IListView<T> {}