gpt4 book ai didi

Java 泛型和类层次结构

转载 作者:行者123 更新时间:2023-11-30 05:01:43 26 4
gpt4 key购买 nike

我遇到了这种情况,我尝试创建一个示例,并想看看是否有任何优雅的方法来解决它。

假设我有一些可显示的界面,并实现类:Person 和 Car,并且我有如下声明的通用转换器类:

public interface Converter<T extends Displayable> {
boolean canConvert(Displayable o);
String convert(T o);
T decode(String s);
boolean canRevert(String s);
}

假设我有这个的实现

public class CarConverter implements Converter<Car> { ... }

public class PersonConverter implements Converter<Person> { ... }

现在在我的使用中,我有一个可显示列表和一个转换器列表,我想转换和恢复可显示:

List<Displayable> ds = new ArrayList<Displayable>();
ds.add(new Person("ma",12));
ds.add(new Person("fa",43));
ds.add(new Car());
ds.add(new Car());
ds.add(new Person("Sol",58));

List<Converter>cs = new ArrayList<Converter>();
cs.add(new CarConverter());
cs.add(new PersonConverter());

ArrayList<String> displays = new ArrayList<String>();
for(Displayable d:ds) {
for(Converter c:cs) {
if(c.canConvert(d)) {
displays.add(c.convert(d));
break;
}
}
}

List<Displayable> ret = new ArrayList<Displayable>();

for(String display : displays) {
for(Converter c:cs) {
if(c.canRevert(display)) {
Displayable d = c.decode(display);
ret.add(d);
}
}
}

令人烦恼的是我必须声明一个转换器列表,从而丢失了泛型。

List<Converter>

如果我尝试声明,则会出现语法错误

List<Convert<Displayable>>

然后我收到很多警告。

最佳答案

您可以执行此操作,只需对列表声明稍作更改即可:

List<Converter<? extends Displayable>> list = ...

这对你有用。这里要记住的关键是,您不能依赖嵌套类型参数中的继承,您需要使用 extends 声明扩展。 .

如果您有List<Converter<Displayable>>您可以添加 Converter<Displayable>该列表中的实例,而不是 Converter<SomethingThatExtendsDisplayable>> .

关于Java 泛型和类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452569/

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