2010-03-12 5 views
10

J'ai les méthodes suivantes:Génériques Java: Quel est le problème du compilateur ici? ("Aucune instance maximale unique")

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

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

Le compilateur dit au sujet de la première méthode:

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

Quel est le problème?

Répondre

16

Le problème est la définition de la deuxième méthode:

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

Il n'y a aucun moyen pour le compilateur de dire quel type T pourrait avoir. Vous devez renvoyer Object ici car vous ne pouvez pas utiliser Type<T> clazz (Type ne prend pas en charge les génériques).

Cela conduit à un cast (T) dans la première méthode qui provoquera un avertissement. Pour se débarrasser de cet avertissement, vous avez deux options:

  1. Dites au compilateur le type. Utilisez cette (impair) Syntaxe:

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

    Notez que vous avez besoin du this ici parce que seul <T>fromJson() est la syntaxe illégale. Utilisez l'annotation @SuppressWarnings("unchecked").

+0

est logique, merci – Epaga

+0

Cette réponse ne va pas. Bien que l'implémentation de la deuxième méthode soit * probablement * non sécurisée (nous ne pouvons pas voir l'implémentation ici), il n'y a rien de mal * techniquement à propos de la déclaration de la seconde méthode. – newacct

+0

Ce n'est pas ce que j'ai dit. Mon argument est 'Type' n'a pas de paramètre générique, donc le cast shadows le' T' de 'Class ' que le compilateur doit utiliser, d'où l'erreur. Mais vous avez raison de dire au compilateur le type avec 'this. '. J'ai amélioré ma réponse. –

13

j'ai rencontré le même problème et trouvé qu'il était un bug (#6302954) dans le JDK. Il a été corrigé en jdk 6u25.

J'ai travaillé autour de l'une des instances de ce problème, mais j'ai décidé de mettre à jour la version JDK sur la boîte CI à la place.

2

Cela semble être un échec d'inférence. La première méthode a clairement l'intention d'appeler la deuxième méthode avec l'argument de type étant le même paramètre de type T qu'elle possède. Mais probablement le compilateur ne peut pas le comprendre parce que son système d'inférence n'est pas assez bon.

Dans tous les cas, vous devriez être en mesure de préciser explicitement l'argument de type et il devrait se débarrasser de l'erreur:

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

moi aussi eu un problème similaire lors de la compilation dans NetBeans. Tout ce que je devais faire était de changer la version du JDK de 16 bits en 32 bits dans les Paramètres> Compiler> Java Platform.

Questions connexes