我有一個接口對象轉換爲字符串:具有無界通配符的Java泛型?
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 ?
我該如何更改代碼?
你爲什麼不使用'asString(Object對象)',而不是使用'轉換器'然後使用'Converter >'它使用泛型冗餘。 –
Shivam
這可行,但類型信息丟失,使得'asString'方法不安全,例如我可以安全地使用'Converter dateConverter =(Converter )converterMap.get(Date.class)''。 –
我看不出它是如何變得不安全的。即使您目前的設計是不安全的,如果您錯誤地映射轉換器對象和類。聲明如'Converter > c = new Converter; c.asString(「abc」);'是非法的,因爲'?'在運行時是未知的,因此它只會期望這個未知類型的一些子類型。 –
Shivam