泛型类型推断不能与方法链接一起使用?

该代码在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());

    }

}

它不会推断Map从中返回的具体类型Map.empty():


$ javac7 A.java

A.java:10: error: method f in class A cannot be applied to given types;

        f(Map.empty());

        ^

  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

如果将f调用更改为,它将编译f(Map.<Integer,String>empty());。在Java 8中,它可以工作而不必求助于此。


但是,如果将f调用更改为f(Map.empty().put(1,"A").put(2,"B"));,它将无法在Java 7和8上再次编译。为什么?


$ $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


蝴蝶刀刀
浏览 343回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java