2013-03-18 66 views
2

這是爲什麼呢?爲什麼內部類是TreeMap.Entry <K,V>通用?

static final class Entry<K,V> implements Map.Entry<K,V> 

爲什麼不只是做這樣的:

static final class Entry implements Map.Entry<K,V> 
+3

提供類型安全?如果不是,你不得不施放,並且失去編譯時類型安全性? – 2013-03-18 11:53:29

+1

那麼,你爲什麼不用自己的'Entry'子類來使用後一種方式,並且看看它是怎麼回事......因爲這是一個好的答案需要做的。 – hyde 2013-03-18 11:54:23

+0

但是Entry類已經知道頂級TreeMap中的類型K和V.它仍然會安全地輸入。它看起來像Entry知道TreeMap K和V,但創建自己的參數類型 – midas 2013-03-18 11:57:19

回答

4

但入門級已經知道了K型和從頂部類TreeMap的訴它仍然會安全地輸入。它看起來像入門知道TreeMap的K和V,但創建自己的參數類型

由於事實上它不:

public class Main<T> { 
    static final class Entry { 
     T t;   // ERROR: Cannot make a static reference to the non-static type T    
     void f(T t) {} // ERROR: Cannot make a static reference to the non-static type T 
    } 
} 

在另一方面,下面的編譯沒有錯誤:

public class Main<T> { 
    static final class Entry<T> { 
     T t; 
     void f(T t) {} 
    } 
} 
+1

因爲它是靜態的,所以自然。它沒有具體的'Main'實例來指代。 – 2013-03-18 12:03:56

4

嗯,明白爲什麼後不能使用外部映射參數的關鍵在於static關鍵字,用來聲明它。

實際K型,V只被實例外地圖,而條目只知道地圖的。所以Entry必須是一個泛型類型,並帶有自己的泛型參數。沒關係,他們被命名爲K,V,如外部類(地圖),他們確定不同的參數。

+0

我真的很喜歡你的解釋。但是,由於類型擦除,是否在運行時完全不存在「K」和「V」? – NPE 2013-03-18 12:11:43

+0

@NPE你是對的。編輯答案 – 2013-03-18 12:17:05

+0

真棒,謝謝(+1) – NPE 2013-03-18 12:17:58

0
static final class Entry implements Map.Entry<K,V> 

這不是在Java中有效的語句輸入接口,參數化,並有來自周圍的元素參數化類型的自動推理的支持。隨着鑽石運營商的推出,Java 7在這個方向邁出了正確的一步。但是,我們需要等到JLS將其定義爲從接口本身推斷類型。

相關問題