簡體   English   中英

為什么我不能創建泛型類型的內部類的數組?

[英]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] 
    [...]

JLS 15.10.1

如果ClassOrInterfaceType不表示可重新類型 (第4.7節),則為編譯時錯誤。 否則, ClassOrInterfaceType可以命名任何命名引用類型,甚至是抽象類類型(第8.1.1.1節)或接口類型。

JLS 4.7:

當且僅當下列之一成立時,類型才可以恢復:

  • 它引用非泛型類或接口類型聲明。

  • 它是一種參數化類型,其中所有類型參數都是無界通配符(第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM