将参数化的Map值传递给通配符签名参数

时间:2018-08-03 11:08:15

标签: java generics

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

  }
}

2 个答案:

答案 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) {
    ;
}