gpt4 book ai didi

java - 在java中传递后代而不是接口(interface)

转载 作者:行者123 更新时间:2023-12-01 17:50:18 26 4
gpt4 key购买 nike

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

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

public void setDataSource(IListViewDataSource dataSource);

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

public void setDataSource(IComplexListViewDataSource dataSource);

IntelliJ 告诉我,即使 IComplexListViewDataSource 扩展了 IListViewDataSource,我也没有重写 IListView 接口(interface)中的方法。

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

最佳答案

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

您可以使用泛型类型参数来解决这个问题。

您的IListView 界面可以有一个类型参数来指定setDataSource 采用哪种类型的参数。您可以使用上限来声明它以限制它的范围。

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

实现类(或扩展接口(interface))可以声明 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注释让编译器确保该方法实际上覆盖或实现预期的方法。

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

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

关于java - 在java中传递后代而不是接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50934067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com