我正在尝试在方法签名中使用通配符类型,并传递不同的参数化类型。如果我将商品参数化为Map,则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()
{
this(null);
}
public GenericItemWrapper(ItemType aItem)
{
mItem = aItem;
}
}
}
答案 0 :(得分:1)
您缺少用于实例化GenericItemWrapper
的参数。应该是
GenericItemWrapper<Long> longWrapper = new GenericItemWrapper<Long>(1l); // example number
但就我所见,您不需要该构造函数,因为您始终可以在类中访问通用类型ItemType
。
答案 1 :(得分:0)
问题在于,即使Map<String,Test.GenericItemWrapper<String>>
是Map<String,Test.GenericItemWrapper<?>>
的“实例”,String
也不是?
的实例。
就像List<String>
不可分配给类型List<Object>
的变量一样。在Java中,没有类型协方差(https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science))