Convertir un object en type générique pour le retourner

Existe-t-il un moyen de convertir un object pour renvoyer la valeur d’une méthode? J’ai essayé de cette façon mais il a donné une exception de compilation dans la partie “instanceof”:

public static  T convertInstanceOfObject(Object o) { if (o instanceof T) { return (T) o; } else { return null; } } 

J’ai également essayé celui-ci mais il a donné une exception à l’exécution, ClassCastException:

 public static  T convertInstanceOfObject(Object o) { try { T rv = (T)o; return rv; } catch(java.lang.ClassCastException e) { return null; } } 

Y a-t-il un moyen possible de le faire facilement:

 Ssortingng s = convertInstanceOfObject("ssortingng"); System.out.println(s); // should print "ssortingng" Integer i = convertInstanceOfObject(4); System.out.println(i); // should print "4" Ssortingng k = convertInstanceOfObject(345435.34); System.out.println(k); // should print "null" 

EDIT: J’ai écrit une copie de travail de la réponse correcte:

 public static  T convertInstanceOfObject(Object o, Class clazz) { try { return clazz.cast(o); } catch(ClassCastException e) { return null; } } public static void main(Ssortingng args[]) { Ssortingng s = convertInstanceOfObject("ssortingng", Ssortingng.class); System.out.println(s); Integer i = convertInstanceOfObject(4, Integer.class); System.out.println(i); Ssortingng k = convertInstanceOfObject(345435.34, Ssortingng.class); System.out.println(k); } 

Vous devez utiliser une instance de Class raison de l’effacement de type générique lors de la compilation.

 public static  T convertInstanceOfObject(Object o, Class clazz) { try { return clazz.cast(o); } catch(ClassCastException e) { return null; } } 

La déclaration de cette méthode est la suivante:

 public T cast(Object o) 

Cela peut également être utilisé pour les types de tableau. Cela ressemblerait à ceci:

 final Class intArrayType = int[].class; final Object someObject = new int[]{1,2,3}; final int[] instance = convertInstanceOfObject(someObject, intArrayType); 

Notez que lorsque someObject est passé à convertToInstanceOfObject il a le type d’ Object compilation.

Je tombe sur cette question et cela a attiré mon intérêt. La réponse acceptée est tout à fait correcte, mais je pensais fournir mes constatations au niveau du code d’octet de la JVM pour expliquer pourquoi l’OP rencontrait l’ ClassCastException .

J’ai le code qui est à peu près le même que le code de l’OP:

 public static  T convertInstanceOfObject(Object o) { try { return (T) o; } catch (ClassCastException e) { return null; } } public static void main(Ssortingng[] args) { Ssortingng k = convertInstanceOfObject(345435.34); System.out.println(k); } 

et le code d’octet correspondant est:

 public static  T convertInstanceOfObject(java.lang.Object); Code: 0: aload_0 1: areturn 2: astore_1 3: aconst_null 4: areturn Exception table: from to target type 0 1 2 Class java/lang/ClassCastException public static void main(java.lang.Ssortingng[]); Code: 0: ldc2_w #3 // double 345435.34d 3: invokestatic #5 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double; 6: invokestatic #6 // Method convertInstanceOfObject:(Ljava/lang/Object;)Ljava/lang/Object; 9: checkcast #7 // class java/lang/Ssortingng 12: astore_1 13: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream; 16: aload_1 17: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/Ssortingng;)V 20: return 

Notez que l’instruction de code d’octet de checkcast se produit dans la méthode principale, pas la méthode convertInstanceOfObject et convertInstanceOfObject n’a aucune instruction pouvant lancer une ClassCastException . Étant donné que la méthode principale n’attrape pas l’ ClassCastException lorsque vous exécutez la méthode principale, vous obtiendrez une ClassCastException et non l’attente d’impression null .

Maintenant, je modifie le code à la réponse acceptée:

 public static  T convertInstanceOfObject(Object o, Class clazz) { try { return clazz.cast(o); } catch (ClassCastException e) { return null; } } public static void main(Ssortingng[] args) { Ssortingng k = convertInstanceOfObject(345435.34, Ssortingng.class); System.out.println(k); } 

Le code d’octet correspondant est:

 public static  T convertInstanceOfObject(java.lang.Object, java.lang.Class); Code: 0: aload_1 1: aload_0 2: invokevirtual #2 // Method java/lang/Class.cast:(Ljava/lang/Object;)Ljava/lang/Object; 5: areturn 6: astore_2 7: aconst_null 8: areturn Exception table: from to target type 0 5 6 Class java/lang/ClassCastException public static void main(java.lang.Ssortingng[]); Code: 0: ldc2_w #4 // double 345435.34d 3: invokestatic #6 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double; 6: ldc #7 // class java/lang/Ssortingng 8: invokestatic #8 // Method convertInstanceOfObject:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; 11: checkcast #7 // class java/lang/Ssortingng 14: astore_1 15: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream; 18: aload_1 19: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/Ssortingng;)V 22: return 

Notez qu’il y a une instruction invokevirtual dans la méthode convertInstanceOfObject qui appelle la méthode Class.cast() qui lève ClassCastException qui sera interceptée par catch(ClassCastException e) bock et retournera null ; par conséquent, “null” est imprimé sur la console sans aucune exception.

Si vous ne voulez pas dépendre de l’exception de lancement (que vous ne devriez probablement pas), vous pouvez essayer ceci:

 public static  T cast(Object o, Class clazz) { return clazz.isInstance(o) ? clazz.cast(o) : null; } 
 Object obj; return obj.getClass().cast( obj ); 

Vous pouvez l’utiliser directement au lieu de spécifier le nom de classe de l’object!