【发布时间】:2015-03-06 15:43:35
【问题描述】:
我遇到了无法解释的 java 编译器 (jdk1.6.0_45) 行为。 这里有两个代码 sn-ps——第一个编译,而第二个不编译。 编译:
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));
Maps 和 TreeMultiset 类是 Google-Guava 库的一部分。
第二个 sn-p 无法编译,报错:
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) 也不会出错。
【问题讨论】:
-
提高你的警告。你有很多未经检查的操作,可能会导致一些意想不到的结果。
-
没有一个未经检查的操作——“getComparator()”方法在输入参数上参数化并且类型安全。而且为 TreeMultiset 提供的工厂方法是 Google-Guava 库的一部分,我无能为力。
-
用番石榴标记了这个。对番石榴更熟悉的人可能会提供更好的帮助。
标签: java guava type-inference java-6