Come dice il commento di ILikeTau, non è possibile accedere a una classe definita in un metodo. Si potrebbe definire al di fuori del metodo, ma un'altra possibilità è definire una interface
(o classe astratta). Quindi il codice rimarrebbe all'interno del tuo metodo e potrebbe accedere alle variabili e ai parametri final
definiti nel metodo (che non potresti fare se spostassi l'intera classe all'esterno). Qualcosa di simile:
class Outer {
int a = 100;
public interface AnInterface {
void mInner(); // automatically "public"
}
AnInterface mOuter() { // note that the return type is no longer Object
class Inner implements AnInterface {
@Override
public void mInner() { // must be public
int y = 200;
System.out.println("mInner..");
System.out.println("y : " + y);
}
}
Inner iob = new Inner();
return iob;
}
}
class Demo {
public static void main(String[] args) { // the preferred syntax
Outer t = new Outer();
Outer.AnInterface ob = t.mOuter();
ob.mInner();
}
}
Nota: non testato
Si noti che il tipo di ritorno, e il tipo di ob
, sono state modificate da Object
. Questo perché in Java, se dichiari qualcosa come Object
, puoi accedere solo ai metodi definiti per Object
. Il compilatore deve sapere, al momento della compilazione (non in fase di esecuzione) che il tuo oggetto ob
ha un metodo mInner
e non può dire che se l'unica cosa che sa è che è un Object
. Modificandolo su AnInterface
, il compilatore ora sa che ha un metodo mInner()
.
qual è l'errore che si get –
Non è possibile accedere a una classe definita in un metodo. Definirlo al di fuori del metodo e sarai in grado di accedervi. –
Eccezione nel thread "main" java.lang.Error: problema di compilazione non risolto: il metodo mInner() non è definito per il tipo Object –