【发布时间】:2017-04-04 19:59:46
【问题描述】:
鉴于这样的课程(部分)
import java.util.*;
import java.util.stream.Collectors;
public class A {
private Map<String, Set<String>> map = new LinkedHashMap<>();
public Map<String, Collection<String>> getMap() {
return Collections.unmodifiableMap(map);
}
public static <K, V> Map<K, V> sorted(Map<K, V> map, Comparator<Map.Entry<? super K, ? super V>> comparator) {
return map
.entrySet()
.stream()
.sorted(comparator)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
public Map<String, Collection<String>> getSortedMap() {
Comparator<Map.Entry<String, Collection<String>>> cmp =
Map.Entry.comparingByValue(Comparator.comparingInt(Collection::size));
return sorted(getMap(), cmp);
}
}
编译时出错
error: method sorted in class A cannot be applied to given types;
return sorted(getMap(), cmp);
^
required: Map<K,V>,Comparator<Entry<? super K,? super V>>
found: Map<String,Collection<String>>,Comparator<Entry<String,Collection<String>>>
reason: cannot infer type-variable(s) K,V
(argument mismatch; Comparator<Entry<String,Collection<String>>> cannot be converted to Comparator<Entry<? super K,? super V>>)
where K,V are type-variables:
K extends Object declared in method <K,V>sorted(Map<K,V>,Comparator<Entry<? super K,? super V>>)
V extends Object declared in method <K,V>sorted(Map<K,V>,Comparator<Entry<? super K,? super V>>)
1 error
当我将A.sorted 签名更改为在comparator 参数上不变时,即<K, V> Map<K, V> sorted(Map<K, V> map, Comparator<Map.Entry<K, V>> comparator) 它编译没有任何问题。但是,我认为我的代码没有违反任何类型关系。这是 Java 类型推断的问题吗?
我正在使用 OpenJDK 8。
【问题讨论】:
标签: java generics type-inference contravariance