簡體   English   中英

Java 7泛型類型推斷:返回值與方法參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM