该代码在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.javaA.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 conversion1 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 conversion1 error$ $javac8 A.javaA.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 output1 error$ $javac8 -Xdiags:verbose A.javaA.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
添加回答
举报
0/150
提交
取消