6
votes

Pourquoi ne puis-je pas créer un tableau d'une classe intérieure d'un type générique?

Le code suivant donne une erreur "création de tableau générique". XXX

Je me demande pourquoi c'est, car la classe entrée n'est pas une classe générique et n'a aucun objet de type générique.

est-ce parce que la classe interne a toujours accès aux types génériques, même s'il n'utilise aucun? C'est le meilleur que je puisse trouver, bien que si c'était le cas, je ne comprends pas pourquoi Java ne pouvait pas regarder et la voir ne fait aucune utilisation de types génériques et n'est donc pas une classe générique?

Et oui, j'ai vu beaucoup de threads sur les tableaux de type générique, mais non, je n'ai trouvé personne en ce qui concerne les classes intérieures.


0 commentaires

3 Réponses :


6
votes

Le type est en réalité testclass .try code> (oui c'est parce que c'est une classe intérieure). Vous pouvez résoudre ceci en le transformant en une classe statique imbriquée:

private static class Entry {
    public Entry() {

    }
}


1 commentaires

... Parfait, a du sens :) Merci, va marquer comme correct quand il me laisse.



5
votes

C'est à propos de ce que les JLS parlent de l'expression de création de tableau: xxx

JLS 15.10.1 :

C'est une erreur de compilation si le classorInterfaceType ne dénote pas un type de type réifiable (§4.7). Sinon, le classorInterfaceType peut nommer tout type de référence nommé, même un type de classe abstraite (§8.1.1.1) ou un Type d'interface.

JLS 4.7 :

Un type est réifiable si et seulement si l'une des suivantes contient:

  • il fait référence à une déclaration de type de classe ou d'interface non générique.

  • C'est un type paramétré dans lequel tous les arguments de type sont sans bornes Wildcards (§4.5.1).

  • C'est un type brut (§4.8).

  • C'est un type primitif (§4.2).

  • Il s'agit d'un type de tableau (§10.1) dont le type d'élément est réifiable.


0 commentaires

1
votes

entrée code> est une classe intérieure non statique. Cela signifie que c'est dans la portée des paramètres génériques de la classe externe. Chaque fois que vous écrivez simplement une entrée non qualifiée code> intérieure testclass code>, cela signifie implicitement testclass .try code>, qui est un type paramétré! Comme vous le savez, vous ne pouvez pas créer de tableaux d'un type paramétré, par exemple. Vous ne pouvez pas faire nouvelle arraylist [5] code>.

Habituellement, la solution de contournement de la création de tableaux d'un type paramétré est de créer une matrice du type brut, c'est-à-dire neuf ArrayList [5] CODE> ou un tableau du type Wildcard-paramétrice, c'est-à-dire Nouvelle ArrayList > [5] code>. Mais dans ce cas, quel est le type brut? La réponse est que vous devez explicitement qualifier entrée code> avec le type de classe externe brut: p> xxx pré>

ou alternativement avec le type wildcard-paramétrice: p >

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


0 commentaires