Est-il possible de paramétrer une superclasse avec une classe de membre statique de la sous-classe?
ExampleSuperClass.java :
package foo; public class ExampleSuperClass { protected T field; public ExampleSuperClass(T field) { this.field = field; } public T getField() { return field; } }
ExampleSubClass.java :
package foo; public class ExampleSubClass extends ExampleSuperClass { static class Member { } public ExampleSubClass() { super(new Member()); } }
La compilation sur ExampleSubClass.java
échoue avec l’erreur suivante:
[javac] ExampleSubClass.java:3: error: cannot find symbol [javac] public class ExampleSubClass extends ExampleSuperClass { [javac] ^ [javac] symbol: class Member [javac] 1 error
ou en Eclipse avec:
Le membre ne peut pas être résolu en un type
dans Eclipse, la super
invocation a aussi l’erreur suivante:
Le constructeur ExampleSuperClass (Member) fait référence au type manquant Member
Cela fonctionne bien (c’est-à-dire sans erreur) si ExampleSubClass est paramétré avec une autre classe de niveau supérieur protégée par le package.
La force mosortingce derrière cela est que j’ai une super classe générique et de nombreuses ${SubClass-extends-GenericSuperClass}.java
et ${ClassUsedBySubClass}.java
. Mais puisque ClassUsedBySubClass
n’est jamais référencé que par SubClass
, il serait agréable de:
ClassUsedBySubClass
en faisant une classe membre statique et ClassUsedBySubClass
. Alors, existe-t-il un moyen d’utiliser la classe membre d’une sous-classe pour paramétrer la super-classe?
S’il n’y en a pas – existe-t-il une approche alternative?
Oui tu peux le faire. Cependant, comme Java utilise l’étendue en dehors de la déclaration pour la résolution de nom, vous devez qualifier le Member
avec le nom ExampleSubClass
:
public class ExampleSubClass extends ExampleSuperClass { ... }
Member
étant une classe interne, vous devez spécifier cela lors de son utilisation en tant que type générique. Je suis capable de le comstackr en utilisant les éléments suivants:
static class ExampleSubClass extends ExampleSuperClass { static class Member { } public ExampleSubClass() { super(new Member()); } }
Member
est une classe nestede statique. On accède à la classe nestede statique en utilisant le nom de la classe englobante:
ExampleSubClass.Member
Vous faites cela à chaque fois qu’une classe nestede statique se produit en dehors de la scope de sa classe externe.
Par conséquent, ce qui suit est correct:
public class ExampleSubClass extends ExampleSuperClass { ^ enclosing class name static class Member { ... } }
Identique à la création d’un object pour la classe nestede statique:
ExampleSubClass.Member member = new ExampleSubClass.Member();