具体参数类型与通配符签名

时间:2018-08-03 09:41:13

标签: java generics

我正在尝试在方法签名中使用通配符类型,并传递不同的参数化类型。如果我将商品参数化为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;
    }

  }
}

2 个答案:

答案 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)