gpt4 book ai didi

具有无限通配符的 Java 泛型?

转载 作者:行者123 更新时间:2023-11-30 06:26:44 24 4
gpt4 key购买 nike

我有一个将对象转换为字符串的接口(interface):

public interface Converter<T> {
String asString(T object);
}

以及存储所有可用转换器的映射:

Map<Class<?>, Converter<?>> converterMap;

现在我有一个异构数据列表要像这样转换:

List<?> data = fetchData();
List<String> stringData = new ArrayList<>(data.size());
for (Object datum : data) {
stringData.add(convertrMap.get(datum.getClass()).asString(datum));
}

但是这段代码无法编译:

error: method asString in interface Converter<T> cannot be applied to given types;
stringData.add(converterMap.get(datum.getClass()).asString(datum));
required: CAP#1
found: Object
reason: actual argument Object cannot be converted to CAP#1 by method invocation conversion
where T is a type-variable:
T extends Object declared in interface Converter
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?

我应该如何更改代码?

最佳答案

您面临名为 wildcard capture 的问题.Java 无法识别将从 List<?> 接收的类型数据。尝试以两种方式中的任何一种重构您的代码

方法一:如下更改界面

interface Converter {
String asString(Object object);
}

方法二:辅助方法通过类型推断捕获通配符

如下创建一个辅助方法,

// Helper method created so that the wildcard can be captured
// through type inference.
private <T> void helper(List<T> data) {
Map<Class<?>, Converter<T>> converterMap = null;
List<String> stringData = null;

for (T datum : data) {
stringData.add(converterMap.get(datum.getClass()).asString(datum));
}
}

调用这个辅助方法如下

List<?> data = fetchData();
helper(data);

关于具有无限通配符的 Java 泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027258/

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