này thất bại trong việc biên dịch trong Java 7:Suy luận kiểu chung không hoạt động với chuỗi phương pháp?
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());
}
}
Nó không suy ra các loại bê tông của Map
được trả lại từ 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
Nó biên dịch nếu bạn thay đổi cuộc gọi f
để f(Map.<Integer,String>empty());
. Trong Java 8, nó hoạt động mà không cần phải sử dụng đến điều này.
Nhưng nếu bạn thay đổi cuộc gọi f
thành f(Map.empty().put(1,"A").put(2,"B"));
, không thể biên dịch lại một lần nữa, trên cả Java 7 và 8. Tại sao?
$ $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
Chỉ cần chắc nó 'tĩnh Bản đồ trống() {return null;}', nó không thích thêm của bạn bất kỳ bổ sử dụng Generics anyway. –