2011-06-01 55 views
3

我一直在通過Java Tutorial,並且已經通過reading about generic type inference in JDK7推斷的泛型類型和JDK7中的反向代碼

我碰到下面的語法...

class MyClass<X> { 
    <T> MyClass(T t) { 
     // ... 
    } 
} 

MyClass<Integer> myObject = new <String`> MyClass<>(""); 

...這是一個有點混亂。我瞭解「鑽石」運算符以及如何根據上下文推斷泛型類型。

我不確定爲什麼要使用菱形運算符來推斷傳遞給構造函數的類型,同時顯式指定類型「String」以及?我也不明白爲什麼涉及到反撥效應!

另外,以下是否有區別?

MyClass<Integer> myObject1 = new <String> MyClass<>(""); // JDK7 only 
MyClass<Integer> myObject2 = new MyClass<>(""); // JDK7 only 
MyClass<Integer> myObject3 = new <String> MyClass<Integer>(""); 
+0

在哪個版本的JDK7中起作用? – axtavt 2011-06-01 10:28:55

+0

@axtavt:它不起作用嗎?哦,該死的,我認真地對待它。 – 2011-06-01 10:31:34

+0

我還沒有嘗試JDK7,我推測鑑於它是官方文檔的一部分,它現在或在不久的將來會在某個時刻起作用。 – chattsm 2011-06-01 10:34:46

回答

2
MyClass<Integer> myObject = new <String> MyClass<>(""); 

只是

MyClass<Integer> myObject = new <String> MyClass<Integer>(""); 

也就是說,你是 1.創建MyClass的<整數> 2的實例調用與字符串的構造爲類型參數:

<String> MyClass(String t) { 
    // ... 
} 

鑽石操作員與第e構造函數,因爲它不會「推斷傳遞給構造函數的類型」,但它推斷傳遞給整個類的類型。

哦,我認爲tutorial example的反色可能是一個印刷錯誤。 :)

+0

我希望反錯是一個錯字!它完全把我扔了。 – chattsm 2011-06-01 10:48:19

+0

我很確定。據我所知,語言規範中沒有定義「反向操作符」。 – ignis 2011-06-01 10:50:49

+2

謝謝!所以,只是重新上限 - MyClass myObject = new MyClass <>(「」); - 與 - MyClass相同 myObject = new MyClass <>(「」); - 當我們讓被推斷? – chattsm 2011-06-01 10:55:15