Java 泛型类型推断不使用方法链接?

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)

此代码在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){}
    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"));