Java通用类型解析

马塞洛瓦尔

我最近开始使用Java,但是在处理泛型类型时仍然感到困惑。以下是我遇到一些问题的简化方案。

我有一个类,其中保存一个使用Class类型作为Key的Map和该类对象的Collection:

public class GenericListInside {
    private Map<Class<?>, List<?>> mapping = new HashMap<>();

    public <T> void addListing(Class<T> clazz, List<T> object) {
        mapping.put(clazz, object);
    }
}

我可以毫无问题地调用addListing:

GenericListInside gli = new GenericListInside();
List<Foo> list = new ArrayList<>(); 
//add something to list
gli.addListing(Foo.class, list); 

现在,我决定创建一个Class以提供流畅的界面。就像是:

with(Foo.class).use(list);

然后我来了:

public class FluidInserter<T> {
    Class<T> clazz;
    GenericListInside gli = new GenericListInside();

    public FluidInserter with (Class<T> clazz) {
        this.clazz = clazz;
        return this;
    }

    public <T> void use(List<T> list) {
        gli.addListing(clazz, list);
    }
}

但是当我尝试编译时,我得到:

错误:(18,12)java:类util.GenericListInside中的方法addListing无法应用于给定类型;
必需:java.lang.Class,java.util.List
找到:java.lang.Class,java.util.List
原因:推断的类型不符合相等约束
推断:T
平等约束:T, Ť

此消息有点令人困惑...任何人都可以找出我在做什么错吗?

美娜

流体生成器的通用方法采用通用方法参数,但是clazz尽管名称重叠,但该参数与字段的类型不同

只需<T>从方法声明中删除,同时保留List<T>为参数即可:

public void use(List<T> list) {
    gli.addListing(clazz, list);
}

题外话注意:你不想回到原始类型化FluidInserter你的with方法。将返回类型更改为:

public FluidInserter<T> with (Class<T> clazz)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章