2012-05-15 15 views
6

sto cercando di estendere la seguente classe con il costruttore (dalla libreria Ektorp):Recuperare l'attributo .class di una classe generica

public class CouchDbRepositorySupport<T extends CouchDbDocument> implements GenericRepository<T> { 

... 

protected CouchDbRepositorySupport(Class<T> type, CouchDbConnector db) { 
... 

} 

Ecco la mia realizzazione:

public class OrderRepository extends CouchDbRepositorySupport<Order<MenuItem>> { 

    public OrderRepository(CouchDbConnector db) { 
     super(Order<MenuItem>.class, db); 

Il problema è con la parte Order<MenuItem>.class. Il compilatore Java mi dice:

Syntax error on token ">", void expected after this 

ho provato con (Order<MenuItem>).class, Order.class e new Order<MenuItem>().getClass() senza fortuna migliore.

Cosa posso fare per recuperare l'attributo .class di una classe generica?

+1

Sembra che ci sia uno di questi a settimana. –

+2

@PaulBellora Forse perché qualsiasi query di google o query SO restituisce solo domande sulla ricerca del tipo di un oggetto generico in fase di esecuzione. Questo problema è un po 'diverso. –

risposta

1

Se si cambia il tipo di pubblicare il tipo interno, è possibile ottenere in questo modo:

public class CouchDbRepositorySupport<C, T extends CouchDbRepositorySupport<C>> implements GenericRepository<T> { 
... 

    protected CouchDbRepositorySupport(Class<C> type, CouchDbConnector db) { 
     ... 
    } 

public class OrderRepository extends CouchDbRepositorySupport<MenuItem, Order<MenuItem>> { 

    public OrderRepository(CouchDbConnector db) { 
     super(MenuItem.class, db); 

Avete alcune scelte su come si dichiara la classe padre; questo è solo un esempio.

Disclaimer: l'ho fatto a mano senza IDE, quindi potrebbero esserci alcuni problemi di sintassi minore, ma il concetto dovrebbe funzionare.

2

la sintassi corretta sarebbe:

Order.class 

In Java, Order<MenuItem>.class e Order.class sono stesso di classe in fase di esecuzione, le informazioni di tipo generico (il parametro <MenuItem> tipo) si perde in fase di esecuzione a causa del type erasure - una grave limitazione del sistema di tipo generico di Java.

+0

Il compilatore java non è d'accordo: "Il costruttore CouchDbRepositorySupport > (Classe , CouchDbConnector) non è definito' –

+0

@jdreux lo hai detto tu stesso: il _compiler_. I tipi generici vengono controllati durante la compilazione, mentre l'espressione 'Ordine .class' viene valutato in fase di runtime e in fase di esecuzione il parametro type" "è _erased_ dalle informazioni sul tipo della classe, come se non fosse mai esistito –

+0

Quindi c'è non sintassi per l'ordine .class perché l'equivalente runtime non esiste? –

Problemi correlati