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

And*_*ham 0 java generics guava

我想尝试做以下事情:

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

本质上,我试图捕获的主要区别是不同的值具有不同的类型参数.但是这会给出错误:

Type mismatch: cannot convert from 
ImmutableMap<String,ArrayList<? extends Object&Serializable&Comparable<?>>>
to ImmutableMap<String,List<?>>
Run Code Online (Sandbox Code Playgroud)

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

rge*_*man 7

您的代码在Java 1.8中编译得很好,但它无法在Java 1.7中编译.Java 1.8中包含改进的目标类型推断.

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

在Java 1.8中,考虑了目标类型,使得映射值的类型参数List<?>取而代之ArrayList<? extends Object&Serializable&Comparable<?>>.

您可以升级到Java 1.8,也可以of方法调用提供显式类型参数.

private static final ImmutableMap<String, List<?>> lists =
     //           vvvvvvvvvvvvvvvvv
     ImmutableMap.<String, List<?>>of(
          "A", new ArrayList<String>(),
          "B", new ArrayList<Integer>());
Run Code Online (Sandbox Code Playgroud)