[英]Why can't I create an array of an inner class of a generic type?
以下代碼給出了“通用數組創建”錯誤。
public class TestClass<K, V> {
Entry[] entry;
private TestClass() {
entry = new Entry[10]; // <--- this line gives generic array creation error
}
private class Entry {
public Entry() {
}
}
}
我想知道為什么會這樣,因為類Entry
不是泛型類,並且沒有泛型類型的對象。
是因為內部類仍然可以訪問泛型類型,即使它不使用任何類型? 這是我能想到的最好的,但如果是這樣的話,我不明白為什么Java看起來不會看到它不使用泛型類型,因此不是泛型類?
是的,我看過許多關於泛型類型數組的線程,但是沒有,我沒有找到一個關於內部類的線程。
類型實際上是TestClass<K, V>.Entry
(是的,因為它是一個內部類)。 您可以通過將其轉換為嵌套的靜態類來解決此問題:
private static class Entry {
public Entry() {
}
}
這是關於JLS談論數組創建表達式的內容:
ArrayCreationExpression:
[...]
new ClassOrInterfaceType DimExprs [Dims]
[...]
如果
ClassOrInterfaceType
不表示可重新類型 (第4.7節),則為編譯時錯誤。 否則,ClassOrInterfaceType
可以命名任何命名引用類型,甚至是抽象類類型(第8.1.1.1節)或接口類型。
當且僅當下列之一成立時,類型才可以恢復:
它引用非泛型類或接口類型聲明。
它是一種參數化類型,其中所有類型參數都是無界通配符(第4.5.1節)。
它是原始類型(§4.8)。
它是一種原始類型(§4.2)。
它是一種數組類型(第10.1節),其元素類型是可恢復的。
Entry
是一個非靜態的內部類。 這意味着它屬於外部類的泛型參數的范圍。 每次你在TestClass
寫一個非限定Entry
,它隱含地意味着TestClass<K,V>.Entry
,這是一個參數化類型! 如您所知,您無法創建參數化類型的數組,例如,您無法執行new ArrayList<String>[5]
。
通常,創建參數化類型數組的方法是創建一個原始類型的數組,即new ArrayList[5]
,或者通配符參數化類型的數組,即new ArrayList<?>[5]
。 但在這種情況下,什么是原始類型? 答案是您必須使用原始外部類類型明確限定Entry
:
entry = new TestClass.Entry[10];
或者使用通配符參數化類型:
entry = (Entry[])new TestClass<?>.Entry[10];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.