2010-03-12 14 views
10

que tiene los siguientes métodos:Genéricos de Java: ¿Cuál es el problema del compilador aquí? ("Ninguna instancia máxima único")

public <T> T fromJson(Reader jsonData, Class<T> clazz) { 
    return fromJson(jsonData, (Type)clazz); 
} 

public <T> T fromJson(Reader jsonData, Type clazz) { 
    ... 
} 

El compilador está diciendo sobre el primer método:

type parameters of <T>T cannot be determined; 
no unique maximal instance exists for type variable T 
with upper bounds T,java.lang.Object 

return fromJson(jsonData, (Type)clazz); 
       ^

¿Cuál es el problema?

Respuesta

16

El problema es la definición del segundo método:

public <T> T fromJson(Reader jsonData, Type clazz) { 

No hay manera para que el compilador para decir qué tipo T podría tener. Debe devolver Object aquí porque no puede usar Type<T> clazz (Type no es compatible con los genéricos).

Esto lleva a un molde (T) en el primer método que causará una advertencia. Para deshacerse de esa advertencia, tiene dos opciones:

  1. Indique al compilador el tipo. Utilice esta (impar) sintaxis:

    this.<T>fromJson(jsonData, (Type)clazz); 
    

    en cuenta que necesita la this aquí porque <T>fromJson() por sí solo es la sintaxis ilegal.

  2. Usa la anotación @SuppressWarnings("unchecked").

+0

tiene sentido, gracias – Epaga

+0

Esta respuesta no es correcta. Aunque la implementación del segundo método es * probablemente * no segura (no podemos ver la implementación aquí), no hay nada * técnicamente * incorrecto sobre la declaración del segundo método. – newacct

+0

Eso no es lo que dije. Mi argumento es 'Tipo' no tiene un parámetro genérico, por lo que el elenco sombrea la' T' de 'Clase ' que el compilador debería usar, de ahí el error. Pero estás en lo cierto al decir que el compilador tiene el tipo 'this. '. He mejorado mi respuesta. –

13

me encontré con el mismo problema y se encontró que era un error (#6302954) en el JDK. Fue arreglado en jdk 6u25.

He trabajado alrededor de una de las instancias de este problema pero decidí actualizar la versión de JDK en el cuadro de CI en su lugar.

2

Esto parece una falla de inferencia. El primer método claramente intenta llamar al segundo método con el argumento de tipo que es el mismo parámetro de tipo T que tiene. Pero probablemente el compilador no pueda resolverlo porque su sistema de inferencia no es lo suficientemente bueno.

En cualquier caso, debe ser capaz de especificar explícitamente el argumento de tipo y que debe deshacerse del error:

public <T> T fromJson(Reader jsonData, Class<T> clazz) { 
    return this.<T>fromJson(jsonData, (Type)clazz); 
} 
1

yo también tuve un problema similar durante la compilación en NetBeans. Todo lo que tenía que hacer era cambiar la versión de JDK de 16 a 32 bits en Configuración> Compilar> Plataforma Java.

Cuestiones relacionadas