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.
如果我是对的,如果我处理的是类而不是接口,这将毫无问题地工作。这是怎么回事,我怎样才能让它发挥作用?
通常,要覆盖方法,无论您是处理接口还是类,签名都必须完全匹配。这包括方法中参数的确切类型。
您可以使用泛型类型参数解决此问题。
您的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)