pas de enfermant instance de type... dans le champ d'application
J'ai d'enquêter java les classes internes.
J'ai écrit par exemple:
public class Outer {
public Outer(int a){}
public class Inner {
public Inner(String str, Boolean b){}
}
public static class Nested extends Inner{
public static void m(){
System.out.println("hello");
}
public Nested(String str, Boolean b , Number nm) { super("2",true); }
}
public class InnerTest extends Nested{
public InnerTest(){ super("str",true,12); }
}
}
J'invoque de principal à l'aide de chaînes suivantes:
new Outer(1).new Inner("",true);
Je vois erreur de compilation:
java: no enclosing instance of type testInheritancefromInner.Outer is in scope
Pouvez-vous m'expliquer cette situation?
Mise à JOUR
Merci de poster le code complet.
Qu'est-ce
c'est le nom du package
Voir stackoverflow.com/questions/9560600/...
Qu'est-ce
testInheritancefromInner
?c'est le nom du package
Voir stackoverflow.com/questions/9560600/...
OriginalL'auteur gstackoverflow | 2014-03-01
Vous devez vous connecter pour publier un commentaire.
Inner
est un intérieur de classe. Il ne peut être créé lorsqu'il y a un enfermant instance de la classe contenant laInner
définition de la classe.Cependant, vous avez créé un
static
classe imbriquée,Nested
, qui s'étend à partir de cette classe. Lorsque vous essayez d'appeler le super constructeuril va échouer parce que le super constructeur, pour
Inner
, dépend d'une instance deOuter
, qui n'existe pas dans lastatic
contexte de laNested
classe. Jon Skeet fournit une solution.Une explication de la solution apparaît dans la JLS ici.
L'erreur faites-vous allusion? Il voit celui que vous avez mentionné dans votre question?
erreur de sujet), je vois l'erreur qu'après l'exécution de la tentative
J'obtiens la même (un peu moins de ligne différente) erreur de compilation dans l'IDÉE et Eclipse.
veuillez lire la mise à jour
OriginalL'auteur Sotirios Delimanolis
Comme Sotirios a dit, votre imbriquée (pas-intérieure) de la classe n'est pas implicitement avoir une instance de
Outer
de fournir efficacement à laInner
.Vous peut contourner ceci, cependant, par explicitement le préciser avant la
.super
partie:Ou même de l'accepter comme un paramètre:
Cependant, je tiens à fortement vous conseillons d'éviter de telles alambiqué code. - Je éviter les classes imbriquées, la plupart du temps, nommé interne des classes presque toujours, et je n'ai jamais l'aide d'un combinaison de cette façon.
Je ne me souviens jamais en fait, de le faire dans le code réel 🙂
+1 pour se souvenir de la syntaxe, je n'ai jamais vu en vrai code (et ne veux pas) 🙂
Je ne me souviens pas de ça - je l'ai regardé 🙂 (je me suis souvenu que quelque chose comme ce qui existe, certes...)
Je pense que j'ai vu quelque chose comme cela dans la façon de Penser en java" livre
OriginalL'auteur Jon Skeet