2012-04-24 15 views
8

Tengo este código:método Java devolver una instancia de la clase <T se extiende somethng>

public <T extends Scrapper> Class<T> getScrapper() { 
    return MyScrapper.class; 
} 

MyScrapper es una clase que implementa la interfaz Scrapper. ¿Por qué esto no funciona? Me sale el siguiente error en JDK7:

error: incompatible types 
required: Class<T> 
found: Class<MyScrapper> 
where T is a type-variable: 
T extends Scrapper declared in method <T>getScrapper() 

P.S. Honestamente he intentado buscar durante 30-40 minutos enteros.

Actualización: si declaro el método como public Class<? extends Scrapper> getScrapper() { funciona. pero todavía no entiendo por qué la declaración original no estaba compilando. ¿Qué pasa con eso?

+0

¿Qué ocurre si simplemente establece en ControlAltDel

+0

? La forma en que sugiere que no funcione. pero intenté con otra cosa y funcionó. Actualicé la pregunta –

+0

Sí, me estoy cansando. Quise decir cambio solo a Scrapper (sin parametrizar) pero lo tienes que trabajar usando un argumento de clase y si eso se ajusta a tus propósitos directamente en – ControlAltDel

Respuesta

10

Con un método genérico como getScrapper(), la persona que llama del método determina lo que el tipo de argumento actual para el método es (T en este caso). La persona que llama podría elegir cualquier subtipo de Scrapper como T, y su método (que siempre devuelve MyScrapper.class) no devolvería la clase correcta.

Dada la firma del método, la persona que llama de este método sería de esperar para ser capaz de hacer esto:

Class<MyOtherScrapper> c = foo.<MyOtherScrapper>getScrapper(); 

Cambiar el método para devolver Class<? extends Scrapper> que ya no es un método genérico ... hay no hay parámetros de tipo para que la persona que llama lo configure. En cambio, la firma dice que el método devuelve el objeto de clase para algún subtipo desconocido de Scrapper, y MyScrapper.class se ajusta a la factura de eso.

+0

Gracias :) Parece que estaba cansado y bobo ayer cuando hice esta pregunta: D Debería tener yo mismo :) –

Cuestiones relacionadas