我正在尝试执行以下操作:
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<?>>
有没有更好的方法来解决这个问题呢?
答案 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<?>>> = ...;
您不能使用通配符,但可以使用命名类型。因此,您可能需要在类级别而不是字段级别声明类型,但是您可以以正常方式使用声明的类型。