[英]Java 7 generics type inference: return value vs method argument
為什么編譯器能夠在函數返回類型的情況下正確推斷String
類型參數。
public class Generics {
private static List<String> function() {
return new ArrayList<>();
}
}
但是當要推斷的類型是方法參數時它會失敗:
public class Generics {
public static void main(String[] args) {
method(new ArrayList<>());
}
private static void method(List<String> list) {
}
}
這種情況下的錯誤是:
The method method(List<String>) in the type Generics is not applicable
for the arguments (ArrayList<Object>)
這是類型推斷尚未按預期工作的地方之一。
不幸的是,這種行為完全有效且符合要求。
好消息是Java 8將包含改進的類型推斷(JEP 101) ,因此像這樣的情況應該按照您的預期進行編譯:
當這種泛型方法調用的結果傳遞給另一個方法時,編譯器應該能夠推斷出類型似乎是合理的[...]。
不幸的是,在JDK 5/6/7中不允許這樣做 - 程序員可用的唯一選擇是使用顯式類型參數。
除了直接的改進(例如你在這里提到的那些情況)之外,這種改變對於能夠更有效地使用Lambdas(JEP 126)也是必要的(即,不必鍵入大量類型信息)。
在JLS中推斷未解析的類型參數的部分相當復雜,但我理解第一種情況的菱形發生在它受到賦值轉換的位置 ,而在第二種情況下它發生在方法調用轉換中 ,遵循不同的規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.