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

假设我有一些可显示的接口,并实现了类: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>>

10-07 15:28