我遇到了这种情况,我尝试创建一个示例,并想看看是否有任何优雅的方法来解决它。
假设我有一些可显示的界面,并实现类: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/