使用不同的通用类型参数映射值

Map with values using different generic type parameters

我正在尝试执行以下操作:

  private static final ImmutableMap<String, List<?>> lists = ImmutableMap.of(
      "A", new ArrayList<String>(),
      "B", new ArrayList<Integer>());

本质上,我试图捕捉的主要区别是不同的值具有不同的类型参数。然而,这给出了错误:

Type mismatch: cannot convert from 
ImmutableMap<String,ArrayList<? extends Object&Serializable&Comparable<?>>>
to ImmutableMap<String,List<?>>

是否有更好的方法来解决这个问题?

您的代码应该可以工作,但这是我相信您想要的一般概念:

private ImmutableMap<String, List<T extends Object&Serializable&Configurable<?>>> = ...;

不能使用通配符,但可以使用命名类型。因此,您可能需要在 class 级别而不是字段级别声明类型,但随后您可以以正常方式使用声明的类型。

您的代码在 Java 1.8 中编译良好,但在 Java 1.7 中编译失败。 Java 1.8 中包含 improved target type inference.

基本上这意味着在 Java 1.7 中,编译器将尽可能推断泛型类型参数的最具体类型,即使这会导致目标类型出现编译器错误(在本例中, ImmutableMap<String, List<?>>).

在Java 1.8中,考虑了目标类型,因此地图值的类型参数被认为是List<?>而不是ArrayList<? extends Object&Serializable&Comparable<?>>

您可以升级到 Java 1.8,或者您可以为 the of method.

的调用提供显式类型参数
private static final ImmutableMap<String, List<?>> lists =
     //           vvvvvvvvvvvvvvvvv
     ImmutableMap.<String, List<?>>of(
          "A", new ArrayList<String>(),
          "B", new ArrayList<Integer>());