Se si dispone di una classe astratta, è possibile creare un'istanza derivante da una classe anonima concreta. Questo è un esempio:Come istanziare anonimamente una classe astratta memorizzata in un oggetto Class in Java?
abstract class A {
abstract void hello();
}
A say = new A() { void hello() { System.out.println ("hello"); } }
say.hello(); // -> hello
Come fare lo stesso se la classe è memorizzata in un oggetto Classe? Ecco un esempio:
// -*- compile-command: "javac anon.java && java anon"; -*-
class anon
{
anon() throws Exception {}
abstract class AbstractClass
{
AbstractClass() throws Exception {}
abstract void id();
}
AbstractClass x = new AbstractClass()
{
void id() { System.out.println ("X"); }
};
Class<AbstractClass> abstractclass
= (Class<AbstractClass>)Class.forName ("anon$AbstractClass");
AbstractClass y = abstractclass.getConstructor().newInstance();
public static void main (String argv[]) throws Exception
{
anon main = new anon();
main.x.id(); // should print "X"
main.y.id(); // should print "Y"
}
}
Il primo instanziazione (x) funziona bene, ma il secondo (y) non riesce perché cerca di creare un'istanza della classe astratta direttamente senza derivare una classe concreta. Come posso fare questo in Java avendo solo un oggetto di classe?
Attendere. Hai provato a implementare la seconda via con il primo codice? Penso che non funzionerà anche lì. Perché stai provando a creare un'istanza di una classe astratta come quella? Quando crei una classe anonima, stai effettivamente estendendo la tua classe astratta e istanzializzandola, e non la stessa classe astratta. –
No y.id() dovrebbe stampare "Y". – ceving
@ceving .. Hai capito il mio commento? –