Ho una classe base che ha un metodo getType() astratto. Voglio che le sottoclassi siano in grado di implementare questo metodo e fornire la classe reale da utilizzare.Restituisce un tipo di classe nidificata in Java
Nel codice, qualcosa di simile al seguente:
public abstract class A {
public static interface Tile;
protected abstract Class<Tile> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected abstract Class<A.Tile> getTileClass() {
MyTile t = new MyTile(); // WORKS
return MyTile; // ERROR HERE
}
}
Il problema qui è che ottengo "MyTile non può essere risolto" nella linea marcata. Così sto cercando di restituire questo invece:.
ritorno nuova MyTile() getClass()
ma ora Eclipse mi dice:
Tipo non corrispondente: non può convertire da Classe
<
acquisizione n. 1 di? si estende B.MyTile>
alla Classe<
A.Tile>
che io non sono nemmeno sicuro se c'è forse un bug in Eclipse qui in alto (cattura # 1?).
Successivamente, mi sto arrendendo alle interfacce e cerco di utilizzare una classe Tile di base astratta. Con un po 'di aiuto da Eclipse, io alla fine con il seguente codice che sembra per compilare:
public abstract class A {
public static abstract class Tile;
protected abstract Class<? extends Tile> getTileClass();
}
public class B extends A {
public static class MyTile exends A.Tile { }
@Override
protected abstract Class<? extends A.Tile> getTileClass() {
return new MyTile().getClass(); // WORKS
return MyTile; // "Cannot be resolved"
}
}
Così ho praticamente sembra di avere tre domande:
1) E' possibile arrivare a questo lavoro con A . Essere un'interfaccia?
2) Quando si utilizza una classe base, Class<? extends X>
è davvero la strada giusta da percorrere?
3) E come posso restituire il mio riferimento di classe B.MyTile nidificato all'interno del metodo? Il fatto di dover fare new MyTile().getClass()
non può essere corretto, vero?
Probabilmente restituire un 'Class' invece di un oggetto non riflettente è una cattiva idea. –
@Tom Restituzione di una classe nel contesto di tipi controllati è uno schema molto comune, che consente di controllare il tipo * checked * di, ad esempio, una raccolta, in fase di esecuzione. Non conosco altro modo, infatti ... –
Varkhan