作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个将对象转换为字符串的接口(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/
我是一名优秀的程序员,十分优秀!