2015-06-30 13 views
6

Il seguente codice fornisce un errore di "creazione di un array generico".Perché non posso creare un array di una classe interna di un tipo generico?

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() { 

     } 
    } 
} 

mi chiedo perché questo è, perché la classe Entry non è una classe generica e non ha oggetti di tipo generico.

È perché la classe interna ha ancora accesso ai tipi generici, anche se non ne usa? È il meglio che riesco a trovare, anche se, se fosse così, non capisco perché Java non possa guardare e vedere che non fa uso di tipi generici e quindi non è una classe generica?

E sì, ho visto molti thread su array di tipi generici, ma no, non ne ho trovato uno singolo riguardante le classi interne.

risposta

6

Il tipo è in realtà TestClass<K, V>.Entry (sì, è perché è una classe interna). È possibile risolvere questo trasformandola in una classe statica nidificato:

private static class Entry { 
    public Entry() { 

    } 
} 
+0

... perfetto, ha un senso :) grazie, volontà segna come corretto quando mi lascia. – andy

4

Questo è su ciò che JLS sta parlando l'espressione array-creazione:

ArrayCreationExpression: 
    [...] 
    new ClassOrInterfaceType DimExprs [Dims] 
    [...] 

JLS 15.10.1:

Si tratta di un errore in fase di compilazione se lo ClassOrInterfaceType non indica a di tipo reversibile (§4.7). In caso contrario, il ClassOrInterfaceType può denominare qualsiasi tipo di riferimento con nome, anche un tipo di classe astratta (§8.1.1.1) o un tipo di interfaccia .

JLS 4.7:

Un tipo è reifiable se e solo se una delle seguenti vale:

  • si riferisce ad una dichiarazione di tipo classe o interfaccia non generico.

  • È un tipo parametrizzato in cui tutti gli argomenti di tipo sono illimitati caratteri jolly (§4.5.1).

  • È un tipo non elaborato (§4.8).

  • È un tipo primitivo (§4.2).

  • È un tipo di matrice (§10.1) il cui tipo di elemento è modificabile.

0

Entry è una classe interna non statica. Ciò significa che è nell'ambito dei parametri generici della classe esterna. Ogni volta che scrivi solo uno Entry non qualificato all'interno di TestClass, implicitamente significa TestClass<K,V>.Entry, che è un tipo parametrico! Come sai, non puoi creare matrici di un tipo parametrico, ad es. non puoi fare new ArrayList<String>[5].

Solitamente, la soluzione per la creazione di array di un tipo parametrico, è quello di creare una matrice di tipo grezzo invece, cioè new ArrayList[5], oppure un array di tipo jolly-parametrizzato, cioè new ArrayList<?>[5]. Ma in questo caso, qual è il tipo grezzo? La risposta è che è necessario qualificare in modo esplicito Entry con il tipo grezzo esterno classe:

entry = new TestClass.Entry[10]; 

o in alternativa con il tipo jolly-parametrizzato:

entry = (Entry[])new TestClass<?>.Entry[10]; 
Problemi correlati