【问题标题】:Map with values using different generic type parameters使用不同的泛型类型参数映射值
【发布时间】:2016-01-05 06:13:45
【问题描述】:

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

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

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

【问题讨论】:

  • 这对我有用。是不是只有一行不适合你?
  • 这对你有用吗?是的,这是唯一行不通的线路。
  • 是的。我将确切的代码行复制/粘贴到我的 IDE 中。您使用的是哪个 Java 版本?我目前正在使用1.8.0_66
  • 我认为这是另一个问题中的问题:stackoverflow.com/questions/19143959/… 更改为构建器模式而不是使用 of 方法解决了该问题。也许这已经在比我使用的更高版本的库中得到修复。
  • 可能是。我正在使用guava-r09

标签: java generics guava


【解决方案1】:

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

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

在Java 1.8中,考虑了目标类型,因此map的值的类型参数被取为List&lt;?&gt;而不是ArrayList&lt;? extends Object&amp;Serializable&amp;Comparable&lt;?&gt;&gt;

您可以升级到 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>());

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 2016-08-11
      • 2023-04-04
      相关资源
      最近更新 更多