Java 泛型和类层次结构

标签 java generics

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

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

相关文章:

c# - 泛型类中的泛型集合

C#/.NET 泛型和 Cdecl Varargs 错误?

java - 勉强量词行为的原因??在 Java 正则表达式中

java - 在Java中将字符串中的更多空白空间折叠成单个空白空间?

java - 从java中的文件读取

java - 回到基础: Generics in Method Sig

Java 泛型 : compatible service subclass

java - Gradle:复制子项目资源

java - 我无法在 java 中修改我的静态变量

java - 通用数组创建