Java 泛型类型推断不使用方法链接?
此代码在Java 8中编译,但在Java 7中编译失败:Java 泛型类型推断不使用方法链接?,java,generics,java-7,java-8,type-inference,Java,Generics,Java 7,Java 8,Type Inference,此代码在Java 8中编译,但在Java 7中编译失败: class Map<K,V> { static <K,V> Map<K,V> empty() {return null;} Map<K,V> put(K k, V v) {return null;} V get(K k) {return null;} } class A { static void f(Map<Integer,String> m)
class Map<K,V> {
static <K,V> Map<K,V> empty() {return null;}
Map<K,V> put(K k, V v) {return null;}
V get(K k) {return null;}
}
class A {
static void f(Map<Integer,String> m){}
public static void main(String[] args) {
f(Map.empty());
}
}
如果将f
调用更改为f(Map.empty()),它将编译代码>。在Java8中,它不必求助于此
但是如果将f
调用更改为f(Map.empty().put(1,“A”).put(2,“B”)代码>,它无法在Java7和Java8上再次编译。为什么?
$ $javac7 A.java
A.java:10: error: method f in class A cannot be applied to given types;
f(Map.empty().put(1,"A").put(2,"B"));
^
required: Map<Integer,String>
found: Map<Object,Object>
reason: actual argument Map<Object,Object> cannot be converted to Map<Integer,String> by method invocation conversion
1 error
$ $javac8 A.java
A.java:10: error: incompatible types: Map<Object,Object> cannot be converted to Map<Integer,String>
f(Map.empty().put(1,"A").put(2,"B"));
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
$ $javac8 -Xdiags:verbose A.java
A.java:10: error: method f in class A cannot be applied to given types;
f(Map.empty().put(1,"A").put(2,"B"));
^
required: Map<Integer,String>
found: Map<Object,Object>
reason: argument mismatch; Map<Object,Object> cannot be converted to Map<Integer,String>
1 error
$$javac7 A.java
A.java:10:错误:类A中的方法f不能应用于给定的类型;
f(Map.empty().put(1,“A”).put(2,“B”);
^
必需:地图
发现:地图
原因:实际参数映射无法通过方法调用转换转换为映射
1错误
$$javac8 A.java
A.java:10:错误:不兼容的类型:无法将映射转换为映射
f(Map.empty().put(1,“A”).put(2,“B”);
^
注:部分信息已被简化;使用-Xdiags:verbose重新编译以获得完整输出
1错误
$$javac8-Xdiags:verbose A.java
A.java:10:错误:类A中的方法f不能应用于给定的类型;
f(Map.empty().put(1,“A”).put(2,“B”);
^
必需:地图
发现:地图
原因:参数不匹配;无法将映射转换为映射
1错误
为什么
因为泛型类型的类型推断还没有扩展到链式调用
从:
什么是目标类型的概念已经扩展到包括方法参数
这就是为什么该代码:
f(Map.empty());
编译
但这段代码没有,因为这是一个链式调用:
f(Map.empty().put(1,"A").put(2,"B"));
您还可以在(特别是D部分)中找到一个小段落:
人们对允许推理“链”产生了一些兴趣:在a().b()中,将类型信息从b的调用传递到a的调用。这又增加了推理算法的复杂性,因为部分信息必须双向传递;它仅在所有实例化(例如List)的a()返回类型的擦除都已修复时起作用。由于目标类型不容易派生,因此此功能不太适合多边形表达式模型;但是,也许有了更多的增强功能,它可以在将来添加
所以可能在Java9中。-只是为了更简单地回答这个问题
unSortedMap.entrySet().stream()
.filter(e->e.getValue()>1)
.sorted(Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap)(条目::getKey,条目::getValue,
(e1,e2)->e1,LinkedHashMap::new)代码>只需将其设置为static Map empty(){return null;}
,这与使用泛型添加任何修饰符不同。
f(Map.empty().put(1,"A").put(2,"B"));