我最近开始使用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] 删除。
我来说两句