Question

Qui a raison? Eclipse ou javac?

--------------- c / v / A.java ---------------

package c.v;
public class A<T> {
}

--------------- c / v / B.java ---------------

package c.v;
public class B extends A<B.Secret> {
  private class Secret {};
}

Eclipse compile B.java très bien.

Javac a un problème.

$ javac c/v/B.java
c/v/B.java:3: c.v.B.Secret has private access in c.v.B
public class B extends A<B.Secret> {
                           ^
    1 error
Était-ce utile?

La solution

Les parties pertinentes du Java Language Specification doit être:

§8.1.4: [...] Le ClassType doit nommer un type de classe accessible (§6.6), ou une erreur de compilation se produit.

§6.6.1: [...] Un élément (classe, interface, un champ ou méthode) d'une référence (classe, interface, ou une matrice) de type ou d'un constructeur d'un type de classe est accessible uniquement si le type est accessible et l'élément ou le constructeur est déclaré pour permettre l'accès:

  • Si le membre ou le constructeur est déclaré publique, l'accès est autorisé. Tous les membres d'interfaces sont implicitement public. [...]
    • Dans le cas contraire, si le membre ou le constructeur est déclaré privé, l'accès est autorisé si et seulement si elle se produit dans le corps de la classe de niveau supérieur (§7.6) qui enserre la déclaration du membre ou constructeur.

Donc, puisque le ClassType n'est pas dans le corps de la classe, B.Secret n'est pas accessible à cet endroit, donc A<B.Secret> n'est pas accesible, donc une erreur de compilation devrait se produire.

Autres conseils

Eclipse est erroné. Si vous annoncez quelque chose comme

extends A<X>

vous devez savoir sur les deux A et X.

Je tendance à penser javac est juste. Afin de créer une nouvelle classe

A<B.Secret>

les besoins génériques d'avoir accès à la classe qu'il utilise. Le fait que B étend alors cette classe est mineure.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top