Java通用类型解析

mar*_*lle 5 java generics

我最近开始使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

with(Foo.class).use(list);
Run Code Online (Sandbox Code Playgroud)

然后我来了:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Men*_*ena 5

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

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

public void use(List<T> list) {
    gli.addListing(clazz, list);
}
Run Code Online (Sandbox Code Playgroud)

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

public FluidInserter<T> with (Class<T> clazz)
Run Code Online (Sandbox Code Playgroud)