Existe-t-il un moyen de convertir un objet pour renvoyer la valeur d'une méthode? J'ai essayé de cette façon mais cela a donné une exception de temps de compilation dans la partie "instanceof":
public static <T> 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 d'exécution, ClassCastException:
public static <T> T convertInstanceOfObject(Object o) {
try {
T rv = (T)o;
return rv;
} catch(java.lang.ClassCastException e) {
return null;
}
}
Existe-t-il un moyen possible de le faire facilement:
String s = convertInstanceOfObject("string");
System.out.println(s); // should print "string"
Integer i = convertInstanceOfObject(4);
System.out.println(i); // should print "4"
String k = convertInstanceOfObject(345435.34);
System.out.println(k); // should print "null"
EDIT: j'ai écrit une copie de travail de la bonne réponse:
public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
try {
return clazz.cast(o);
} catch(ClassCastException e) {
return null;
}
}
public static void main(String args[]) {
String s = convertInstanceOfObject("string", String.class);
System.out.println(s);
Integer i = convertInstanceOfObject(4, Integer.class);
System.out.println(i);
String k = convertInstanceOfObject(345435.34, String.class);
System.out.println(k);
}
null
? et pourquoi ne pas retourner unObject
? L'effacement Java traduira de toute façon votre générique en unObject
, alors pourquoi n'écrivez-vous pas directementpublic static Object convertInstanceOfObject
?Réponses:
Vous devez utiliser une
Class
instance en raison de l'effacement du type générique lors de la compilation.La déclaration de cette méthode est:
Cela peut également être utilisé pour les types de tableaux. Cela ressemblerait à ceci:
Notez que quand lui
someObject
est passéconvertToInstanceOfObject
a le type de compilationObject
.la source
{ catch(ClassCastException e) { return null; }
impardonnableJe suis tombé sur cette question et elle a attiré mon intérêt. La réponse acceptée est tout à fait correcte, mais je pensais fournir mes conclusions au niveau du code d'octet JVM pour expliquer pourquoi l'OP rencontre le
ClassCastException
.J'ai le code qui est à peu près le même que le code d'OP:
et le code d'octet correspondant est:
Notez que l'
checkcast
instruction de code d'octet se produit dans la méthode main et non la méthodeconvertInstanceOfObject
etconvertInstanceOfObject
n'a aucune instruction pouvant être lancéeClassCastException
. Parce que la méthode main n'attrape pas leClassCastException
donc, lorsque vous exécutez la méthode principale, vous obtiendrez unClassCastException
et non l'attente d'impressionnull
.Maintenant, je modifie le code à la réponse acceptée:
Le code d'octet correspondant est:
Notez qu'il y a une
invokevirtual
instruction dans laconvertInstanceOfObject
méthode qui appelle laClass.cast()
méthode qui lanceClassCastException
qui sera capturée par lecatch(ClassCastException e)
bock et retournéenull
; par conséquent, "null" est imprimé sur la console sans aucune exception.la source
Si vous ne voulez pas dépendre de la levée d'exception (ce que vous ne devriez probablement pas), vous pouvez essayer ceci:
la source
isAssignableFrom
.