2012-05-15 9 views
6

Estoy tratando de extender la siguiente clase con el constructor (de la biblioteca EKTORP):recuperar el atributo .class de una clase genérica

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

... 

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

} 

Aquí está mi aplicación:

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

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

El problema es con la parte Order<MenuItem>.class. El compilador de Java me dice:

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

he intentado con (Order<MenuItem>).class, Order.classnew Order<MenuItem>().getClass() y con mejor suerte.

¿Qué puedo hacer para recuperar el atributo .class de una clase genérica?

+1

Parece que hay uno de estos por semana. –

+2

@PaulBellora Posiblemente porque cualquier consulta de google o consulta SO solo devuelve preguntas sobre cómo encontrar el tipo de un objeto genérico en tiempo de ejecución. Este problema es algo diferente. –

Respuesta

1

Si cambia el tipo de publicar el tipo interno, se puede obtener de esta manera:

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); 

Usted tiene algunas opciones sobre cómo se declara la clase padre; Esto es sólo un ejemplo.

Descargo de responsabilidad: Hice esto a mano sin un IDE, por lo que podría haber algunos problemas menores de sintaxis, pero el concepto debería funcionar.

2

La sintaxis correcta sería:

Order.class 

En Java, Order<MenuItem>.class y Order.class son la misma clase en tiempo de ejecución, la información de tipo genérico (el parámetro <MenuItem> tipo) se pierde en tiempo de ejecución debido a type erasure - una limitación severa del sistema de tipo genérico de Java.

+0

El compilador de Java no está de acuerdo con eso: 'El constructor CouchDbRepositorySupport > (Clase , CouchDbConnector) no está definido' –

+0

@jdreux lo ha dicho usted mismo: el _compiler_. Los tipos genéricos se verifican durante la compilación, mientras que la expresión 'Order .class' se evalúa en tiempo de ejecución, y en tiempo de ejecución el parámetro type' 'se borra de la información de tipo de la clase, como si nunca hubiera existido –

+0

Así que hay sin sintaxis para la orden .class porque su equivalente en tiempo de ejecución no existe? –

Cuestiones relacionadas