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

时间:2016-01-04 21:54:03

标签: 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<?>>

有没有更好的方法来解决这个问题呢?

2 个答案:

答案 0 :(得分:7)

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

基本上这意味着在Java 1.7中,编译器将推断可能的最具体类型的泛型类型参数,即使这会导致编译器出现目标类型错误(在这种情况下,# initial datasets A <- data.table(a = 1:4, b = 12:15) B <- data.table(a = 2:3, b = 13:14) # large datasets for the benchmark set.seed(2019) AA <- data.table(aa = 1:1e8, bb = sample(12:19, 1e7, TRUE)) BB <- data.table(aa = sample(AA$a, 2e5), cc = sample(2:8, 2e5, TRUE)) )。

在Java 1.8中,会考虑目标类型,以便将地图的值的类型参数视为ImmutableMap<String, List<?>>而不是List<?>

您可以升级到Java 1.8,也可以为the of method的调用提供显式类型参数。

ArrayList<? extends Object&Serializable&Comparable<?>>

答案 1 :(得分:0)

您的代码应该有效,但这是我认为您想要的一般概念:

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

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