2010-03-12 1 views
10

ho i seguenti metodi:Generici Java: qual è il problema del compilatore qui? ("No unica istanza massima")

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

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

Il compilatore è detto circa il primo metodo:

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

Qual è il problema?

risposta

16

Il problema è la definizione del secondo metodo:

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

v'è alcun modo per il compilatore per dire che tipo T potrebbe avere. È necessario restituire Object qui perché non è possibile utilizzare Type<T> clazz (Type non supporta i generici).

Questo porta a un cast (T) nel primo metodo che causerà un avviso. Per eliminare questo avviso, hai due opzioni:

  1. Dillo al compilatore il tipo. Utilizzare questa (dispari) sintassi:

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

    Nota che è necessario il this qui perché <T>fromJson() solo è la sintassi illegale.

  2. Utilizzare l'annotazione @SuppressWarnings("unchecked").

+0

ha senso, grazie – Epaga

+0

Questa risposta non è giusta. Sebbene l'implementazione del secondo metodo sia * probabilmente * non sicura per tipo (non possiamo vedere l'implementazione qui), non c'è nulla * tecnicamente * sbagliato riguardo alla dichiarazione del secondo metodo. – newacct

+0

Non è quello che ho detto. Il mio argomento è 'Type' non ha parametri generici, quindi il cast ombreggia il' T' di 'Classe ' che il compilatore dovrebbe usare, quindi l'errore. Ma hai ragione che puoi dire al compilatore il tipo con "questo". '. Ho migliorato la mia risposta. –

13

ho incontrato lo stesso problema e ho trovato che fosse un bug (#6302954) nel JDK. È stato corretto in jdk 6u25.

Ho lavorato su una delle istanze di questo problema, ma ho deciso di aggiornare la versione JDK sulla casella CI.

2

Questo sembra un fallimento dell'inferenza. Il primo metodo intende chiaramente chiamare il secondo metodo con l'argomento type che è lo stesso parametro di tipo T che ha. Ma probabilmente il compilatore non può capirlo perché il suo sistema di inferenza non è abbastanza buono.

In ogni caso, si dovrebbe essere in grado di specificare in modo esplicito l'argomento di tipo e dovrebbe sbarazzarsi di l'errore:

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

Anch'io ho avuto un problema simile durante la compilazione in NetBeans. Tutto quello che dovevo fare era cambiare la versione JDK da 16 bit a 32 bit in Impostazioni> Compila> Piattaforma Java.