我正在用Java实现两种类型的列表,一种只是标签列表,另一种在每行上还提供两个按钮。
我创建了一个名为IListView的接口,它包含以下方法:
public void setDataSource(IListViewDataSource dataSource);
问题在于,当创建第二种类型的列表时,它使用另一种称为IComplexListViewDataSource
的数据源来扩展前一个列表,并像这样实现先前的方法:
public void setDataSource(IComplexListViewDataSource dataSource);
IntelliJ告诉我,即使IListView
扩展了IComplexListViewDataSource
,我也没有覆盖IListViewDataSource
界面中的方法。
如果我是正确的,那么如果我正在处理类而不是接口,这将毫无问题。发生了什么事,我如何使它正常工作?
答案 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> {}