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

标签 java generics guava

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

  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<?>>

是否有更好的方法来做到这一点或解决这个问题?

最佳答案

您的代码在 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>());

关于java - 使用不同泛型类型参数映射值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34600565/

相关文章:

java - 当 jvm 进程被杀死时,有什么方法可以执行一些 java 代码?

java - 获取 java.util.Map 参数的通用类型

c# - 在 C# 中实现通用非托管数组

generics - 当其中一个是本地引用时,如何在类型约束中编写引用的生命周期?

java - 如何根据多重映射中存在的值检索 key ?

java - 从 ResultSet 获取列宽度/长度的最简单方法 - 我必须迭代吗?

Java - 外部类内部的内部类数组

java - 如何在 Java 中获取 .class 的所有属性?

list - 代码质量/ Guava : clear and fill a final list or assign a new Immutablelist

java - Guava 不可变排序多重集 : how to "sum" two instances?