我正在尝试在方法签名中使用通配符类型,并传递不同的参数化类型。如果它只是一个 GenericItemWrapper ,它可以正常工作,但是如果该GenericItemWrapper本身是一个类型参数,则它会失败。以下是eclipse抱怨的问题:
The method DoStuff(Map<String, Test.GenericItemWrapper<?>>) in the type Test
is not applicable for the arguments (Map<String, Test.GenericItemWrapper<String>>)
代码如下:
import java.util.Map;
public class Test
{
public static void main(String[] args)
{
Map<String, GenericItemWrapper<Long>> longWrapper = null;
Map<String, GenericItemWrapper<String>> stringWrapper = null;
Test t = new Test();
t.DoStuff(longWrapper); // error here
t.DoStuff(stringWrapper); // error here
}
public void DoStuff(Map<String, GenericItemWrapper<?>> aParam)
{
;
}
public static class GenericItemWrapper<ItemType>
{
private ItemType mItem;
public GenericItemWrapper(ItemType aItem)
{
mItem = aItem;
}
}
}
答案 0 :(得分:2)
尝试一下:
public void DoStuff(Map<String, ? extends GenericItemWrapper<?>> aParam) {}
有关泛型的更多调查,您可以参考以下答案:Java nested generic type
基本上,第一个?
指的是您正在创建类似Map<String, ?>
之类的泛型,因此您可以将任何类型的Object放入地图。
第二个?
,即GenericItemWrapper<?>
内部的那个,只是概括了您可能知道的项目。
因此,写Map<String, ? extends GenericItemWrapper<?>>
意味着您正在泛化Map值(使用第一个?
),并且您想要放入映射中的通用对象的类型也必须是泛型类型(又名extends GenericItemWrapper<?>
)
答案 1 :(得分:0)
Eclipse不会抱怨:
public <T> void DoStuff(Map<String, GenericItemWrapper<T>> aParam) {
;
}