没有辅助变量,Javac无法推断出类型

时间:2015-03-06 15:43:36

标签: java guava type-inference java-6

我遇到了一个我无法解释的java编译器(jdk1.6.0_45)行为。 这是两个代码片段 - 第一个编译,而第二个不编码。 编译:

Map<String, Collection<MyClass>> result = Maps.newHashMap();

Comparator<? super MyClass> comparator = comparatorProvider.getComparator(*some parameter*);
TreeMultiset<MyClass> multiSet = TreeMultiset.create(comparator);
result.put("blahBlah", multiSet);

不编译:

Map<String, Collection<MyClass>> result = Maps.newHashMap();

Comparator<? super MyClass> comparator = comparatorProvider.getComparator(*some parameter*);
result.put("blahBlah", TreeMultiset.create(comparator));

地图和TreeMultiset课程是Google-Guava图书馆的一部分。

第二个代码段无法编译,出现以下错误:

put(java.lang.String,java.util.Collection<MyClass>) in java.util.Map<java.lang.String,java.util.Collection<MyClass>> cannot be applied to (java.lang.String,com.google.common.collect.TreeMultiset<java.lang.Object>)

请注意 java.lang.Object 部分错误。因此,如果没有明确的“multiset”变量,javac似乎无法推断TreeMultiset的类型。

以下是工厂方法的代码:

@SuppressWarnings("unchecked")
public static <E> TreeMultiset<E> create(
  @Nullable Comparator<? super E> comparator) {
return (comparator == null)
       ? new TreeMultiset<E>((Comparator) Ordering.natural())
       : new TreeMultiset<E>(comparator);
}

对此行为的任何澄清都将非常感激。

即使IDE(Intellij IDEA)也没有错误。

1 个答案:

答案 0 :(得分:3)

Java类型推断没有我们想要的那么强(与Scala相比)。您可以在没有辅助变量的情况下提供相同类型的参数:

result.put("blahBlah", TreeMultiset.<MyClass>create(comparator));