Existe uma maneira de converter um objeto para retornar o valor de um método? Eu tentei dessa maneira, mas deu uma exceção de tempo de compilação na parte "instanceof":
public static <T> T convertInstanceOfObject(Object o) {
if (o instanceof T) {
return (T) o;
} else {
return null;
}
}
Eu também tentei este, mas deu uma exceção de tempo de execução, ClassCastException:
public static <T> T convertInstanceOfObject(Object o) {
try {
T rv = (T)o;
return rv;
} catch(java.lang.ClassCastException e) {
return null;
}
}
Existe uma maneira possível de fazer isso facilmente:
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: eu escrevi uma cópia de trabalho da resposta correta:
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
? e, por que você não retorna umObject
? O apagamento de Java de qualquer maneira traduz seu genérico em umObject
, então por que você não escreve diretamentepublic static Object convertInstanceOfObject
?Respostas:
Você precisa usar uma
Class
instância devido ao apagamento de tipo genérico durante a compilação.A declaração desse método é:
Isso também pode ser usado para tipos de matriz. Seria assim:
Observe que quando
someObject
é passado paraconvertToInstanceOfObject
ele, tem o tipo de tempo de compilaçãoObject
.fonte
{ catch(ClassCastException e) { return null; }
é imperdoávelEu me deparo com essa pergunta e ela me interessou. A resposta aceita está completamente correta, mas pensei em fornecer minhas descobertas no nível de código de bytes da JVM para explicar por que o OP encontra o
ClassCastException
.Eu tenho o código que é praticamente o mesmo que o código do OP:
e o código de bytes correspondente é:
Observe que a
checkcast
instrução do código de bytes ocorre no método principal, e não o métodoconvertInstanceOfObject
econvertInstanceOfObject
não possui nenhuma instrução que possa ser lançadaClassCastException
. Como o método principal não captura,ClassCastException
portanto, quando você executa o método principal, você obtém umaClassCastException
e não a expectativa de impressãonull
.Agora eu modifico o código para a resposta aceita:
O código de bytes correspondente é:
Observe que existe uma
invokevirtual
instrução noconvertInstanceOfObject
método que chama oClass.cast()
método que lançaClassCastException
que será capturado pelacatch(ClassCastException e)
bock e retornaránull
; portanto, "null" é impresso no console sem nenhuma exceção.fonte
Se você não quiser depender da exceção de lançamento (o que provavelmente não deveria), tente o seguinte:
fonte
isAssignableFrom
.