簡體   English   中英

使用不同的泛型類型參數映射值

[英]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<?>>

是否有更好的方法可以解決此問題?

您的代碼在Java 1.8中可以正常編譯,但在Java 1.7中無法編譯。 Java 1.8中包括改進的目標類型推斷

基本上,這意味着在Java 1.7中,編譯器將推斷出通用類型參數的最具體類型,即使這會導致目標類型出現編譯器錯誤(在這種情況下, ImmutableMap<String, List<?>> )。

在Java 1.8中,考慮了目標類型,因此映射值的type參數被視為List<?>而不是ArrayList<? extends Object&Serializable&Comparable<?>> 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>());

您的代碼應該可以工作,但這是我相信您想要的一般概念:

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

您不能使用通配符,但是可以使用命名類型。 因此,您可能需要在類級別而不是字段級別聲明類型,但是您可以按常規方式使用聲明的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM