gpt4 book ai didi

Java 泛型类型解析

转载 作者:搜寻专家 更新时间:2023-11-01 01:32:40 26 4
gpt4 key购买 nike

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

我有一个类,它包含一个使用类类型作为键的映射和该类对象的集合:

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);

现在我决定创建一个类来提供流畅的界面。像这样的东西:

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);
}
}

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

Error:(18, 12) java: method addListing in class util.GenericListInside cannot be applied to given types;
required: java.lang.Class,java.util.List
found: java.lang.Class,java.util.List
reason: inferred type does not conform to equality constraint(s)
inferred: T
equality constraints(s): 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)

关于Java 泛型类型解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com