我遇到这种情况,我尝试创建一个示例,并想看看是否有任何优雅的方法来修复它。
假设我有一些可显示的接口,并实现了类:Person和Car,并且我声明了通用的Converter类,如下所示:
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> { ... }
现在,在我的使用中,我有一个Displayable列表和一个转换器列表,我想转换和还原Displayable:
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);
}
}
}
令人讨厌的一点是,我不得不声明一个Converter列表,从而失去了泛型。
List<Converter>
如果尝试声明,则会收到语法错误
List<Convert<Displayable>>
然后我收到很多警告。
最佳答案
您可以这样做,您只需要对列表声明进行一些更改:
List<Converter<? extends Displayable>> list = ...
这将为您工作。这里要记住的关键是,您不能依赖嵌套类型参数中的继承,而需要使用
extends
声明扩展名。如果具有
List<Converter<Displayable>>
,则只能将Converter<Displayable>
实例添加到该列表,而不能添加Converter<SomethingThatExtendsDisplayable>>
。