具有无界通配符的Java泛型? [英] Java generics with unbounded wildcard?
问题描述
我有一个将对象转换为字符串的接口:
public interface Converter< T> {
String asString(T object);
}
以及一张存储所有可用转换器的地图:
Map< Class <?>,Converter<>> converterMap;
现在我有一个要转换的异构数据列表:
列表<?> data = fetchData();
列表< String> stringData = new ArrayList<>(data.size());
for(Object datum:data){
stringData.add(convertrMap.get(datum.getClass())。asString(datum));
}
但是这段代码无法编译:
error:interface asString in interface Converter< T>不能应用于给定的类型;
stringData.add(converterMap.get(datum.getClass())。asString(datum));
required:CAP#1
found:Object
reason:actual argument对象无法通过方法调用转换转换为CAP#1
其中T是类型变量:
T扩展在接口Converter
中声明的对象,其中CAP#1是一个新的类型变量:
CAP#1扩展了Object从捕获?
我该如何更改代码?
您遇到通配符问题捕捉。
Java无法识别将从 List <?>>
数据收到的类型。
尝试用以下两种方式中的任何一种重构代码:
方法1:更改您的界面如下
interface Converter {
String asString(Object object);方法2:方法捕获通配符:通过类型推断
创建一个如下的帮助方法,
/创建/ Helper方法,以便通过类型推断可以捕获通配符
//。
私人< T> void helper(List< T> data){
Map< Class<>,Converter< T>> converterMap = null;
列表< String> stringData = null; (T datum:data){
stringData.add(converterMap.get(datum.getClass())。asString(datum));
如下调用这个帮助方法
列表<?> data = fetchData();
helper(data);
I have an interface to convert object to string:
public interface Converter<T> {
String asString(T object);
}
And a map to store all available converters:
Map<Class<?>, Converter<?>> converterMap;
Now I have a list of heterogeneous data to convert like this:
List<?> data = fetchData();
List<String> stringData = new ArrayList<>(data.size());
for (Object datum : data) {
stringData.add(convertrMap.get(datum.getClass()).asString(datum));
}
But this code doesn't compile:
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 ?
How should I change the code?
解决方案 You are facing issue called wildcard capture.
Java is unable to identify the type that will be received from the List<?>
data.
Try refactoring your code in any of the two ways
Method 1: Change your interface as below
interface Converter {
String asString(Object object);
}
Method 2: Helper method to capture wild card by type inference
Create an helper method as below,
// 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));
}
}
Call this helper method as below
List<?> data = fetchData();
helper(data);
这篇关于具有无界通配符的Java泛型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!