Bug dans le compilateur eclipse ou dans javac («les parameters de type de T ne peuvent pas être déterminés»)

Le code suivant

public class GenericsTest2 { public static void main(Ssortingng[] args) throws Exception { Integer i = readObject(args[0]); System.out.println(i); } public static  T readObject(Ssortingng file) throws Exception { return readObject(new ObjectInputStream(new FileInputStream(file))); // closing the stream in finally removed to get a small example } @SuppressWarnings("unchecked") public static  T readObject(ObjectInputStream stream) throws Exception { return (T)stream.readObject(); } } 

comstack en éclipse, mais pas avec javac (les parameters de type de T ne peuvent pas être déterminés; aucune instance maximale unique n’existe pour la variable de type T avec les limites supérieures T, java.lang.Object).

Lorsque je change readObject (fichier de chaîne) en

  @SuppressWarnings("unchecked") public static  T readObject(Ssortingng file) throws Exception { return (T)readObject(new ObjectInputStream(new FileInputStream(file))); } 

il comstack en éclipse et avec javac. Qui est correct, le compilateur eclipse ou javac?

Je dirais que c’est le bogue du compilateur Sun rapporté ici et ici , parce que si vous changez votre ligne à celle ci-dessous, cela fonctionne avec les deux, ce qui semble être exactement ce qui est décrit dans les rapports de bogues.

 return GenericsTest2.readObject(new ObjectInputStream(new FileInputStream(file))); 

Dans ce cas, je dirais que votre code est faux (et le compilateur Sun a raison). Il n’y a rien dans vos arguments d’entrée à readObject pour en déduire le type T Dans ce cas, il est préférable de le laisser renvoyer Object et de laisser les clients lancer manuellement le type de résultat.

Cela devrait fonctionner (même si je ne l’ai pas testé):

 public static  T readObject(Ssortingng file) throws Exception { return GenericsTest2.readObject(new ObjectInputStream(new FileInputStream(file))); } 

Oracle JDK6 u22 devrait être correct mais j’ai ce problème avec JDK6 u24 aussi

Ceci est un bug du bogue eclipse 98379 .

Cela n’a pas été corrigé, mais le problème est résolu par une solution de contournement comme par exemple dans les bogues d’éclipse (voir lien).

J’ai trouvé ce problème dans la version Java “1.6.0_22”. Il a disparu lors de la mise à niveau vers la version Java “1.6.0_32” car il a été corrigé dans la mise à jour 25.

Si vous pouvez modifier votre méthode readObject pour travailler de manière transparente lorsqu’elle est appelée, vous pouvez également utiliser les éléments suivants:

 public static  T readObject(Ssortingng file, Class type) throws Exception { return type.cast(readObject(new ObjectInputStream(new FileInputStream(file)))); } 

De cette façon, l’appelant est obligé de spécifier le type du résultat et le compilateur sait comment convertir le résultat.