2015-09-05 69 views
0

在從java.util.HashMap下面的語法,通用型參數用於類型強制轉換實例化一個原始類型陣列後,從原始型投射到一般類型

Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];

類似的代碼不與類似的語法編譯here (如下圖所示),給錯誤Type safety: Unchecked cast from Node[] to Node<K,V>[]

public class NestedInterfaceInInterface { 

    public static void main(String[] args) { 
     Node<K,V>[] newTab = (Node<K,V>[])new Node[10]; 
     //Node<String,String>[] newTab = (Node<String,String>[])new Node[10]; // this works 


    } 
} 

1)怎樣解決這個問題?

2)語法Node<K,V>[] newTab = (Node<K,V>[])new Node[10];Node<String,String>[] newTab = (Node<String,String>[])new Node[10];有什麼不同?

+0

您不能實例化通用數組類型。因此,他們使用原始類型並投射它。 –

+0

[this]的可能重複(http://stackoverflow.com/questions/14917375/cannot-create-generic-array-of-how-to-create-an-array-of-mapstring-obje)問題。 – bcsb1001

+0

@ bcsb1001你認爲這是重複的問題嗎? – overexchange

回答

3

問題是you can't create an array of a generic type in Java所以你不得不手動將Node[]的原始類型數組轉換爲Node<K,V>[]

該操作稱​​爲type conversion,它在多個場合使用。在這種情況下,你正在做一個不安全的垂頭喪氣,這將產生一個警告

類型安全:未經檢查的投從Node[]Node<K,V>[]

但是你可以的情況下,抑制它。請注意,無法防止此警告,因此您可以考慮使用不會出現此類問題的List<Node<K,V>>

+0

首先,爲什麼我們需要靜態類節點實現Map.Entry {}'?當我們想創建原始類型數組'new Node [newCap]'。它可以是'靜態類節點實現Map.Entry {}'? – overexchange

+2

你不想要一個原始類型數組,但你想要一個泛型類型數組,但是你不能直接創建它。 – Jack

+0

'Node [] newTab =(Node [])new Node [newCap];'**和**'Node [] newTab = new Node [ newCap];'? – overexchange

0

不允許泛型數組的原因是由於Java的類型擦除。即使CollectionsList<T>僅在訪問對象時在ObjectT之間投射。查看仿製藥最安全的方式是使用Collections.checkedCollection,它採用Collection<E>Class<E>並在運行時檢查類型,以防止編譯器在編譯時發出警告。

+0

問題是,行'Node [] newTab =(節點 [])new Node [newCap];'在'java.util.HashMap'中工作,但是'Node [] newTab = [節點 []] )new Node [10];'在這個[示例]中不起作用(https://github.com/shamhub/Java_programming/blob/master/JavaCode/src/StaticMemberClasses/NestedInterfaceInInterface.java)。爲什麼? – overexchange

+1

@overchange由於您沒有在類聲明中指定類型參數'K,V'?將其更改爲'公共類NestedInterfaceInInterface '。 –

+0

這也行不通。他們正在用'static'方法嘗試代碼。使方法通用或者以其他方式引入類型參數。 –