2015-10-28 61 views
6

我已經定義了下面的泛型類,但是當我在類對象上使用它時,它不能編譯。構造函數不會接受其他對象Diamond不編譯Java 7

class Pair<T,V> { 

    T one; 
    V two; 


    public Pair(T one, V two) { 
     this.one = one; 
     this.two = two; 
    } 


} 
public static void main(String[] args) { 

    String hamza = "Hamza"; 
    Integer soufiane = 0; 

    Pair<Object,Object> pairOne = new Pair<>(hamza, soufiane); 
    Pair<Object,Object> pairTwo = new Pair<Object, Object>(soufiane, hamza); 

} 

錯誤消息:

incompatible types: Pair<String,Integer> cannot be converted to Pair<Object,Object> 

爲什麼第一個未編譯和第二編譯?

編輯:它編譯於Java 8

+0

某些東西不編譯並且編譯器不會告訴你_why_它不能編譯是非常罕見的。 – Tom

+1

我在那裏包含錯誤消息!這是菱形符號,它應該編譯,至少據我所知。爲什麼它迫使我包含模板參數是我不明白的。 –

+3

好吧,泛型類型不是多態,因此將'Pair '賦值給'Pair '不起作用,Java 7認爲它應該是'Pair ',因爲你說通過的參數會告訴類型。另一方面,Java 8「找到」正確的泛型類型會更好一些。 – Tom

回答

3

您的代碼失敗,因爲Java編譯器7無法找到合適的推斷類型;另一方面,Java 8將編譯和工作正常。 (TL; DR:Java 7的不正確地與所有的鑽石的作品,這是在Java改進8)

JEP 101: Generalized Target-Type Inference

平順地膨脹方法類型推測的範圍,以支持(ⅰ) 推理在方法上下文中和(ii)鏈接調用中的推理。

含義java 8將能夠使用鑽石算子確定您的呼叫類型。

編輯:看起來像有人毆打我在thread這個反應,並解釋它比我更清楚;所以看看!