Estava estudando métodos genéricos, e tive vontade de escrever um métdo que tivesse a seguinte assinatura:
public static <T> T convert(String className, Object value) {
/*
* Aqui eu teria que aplicar um pouco de reflection pra obter
* um objeto Class correspondente ao className e fazer a conversão.
*/
}
Ou seja, passando um Object e um nome de classe, gostaria de fazer um cast de Object para o nome da classe que estou passando.
Isso seria possível? Grato.
Possível é, mas não vai dar muito certo não.
O compilador não vai ter como determinar o que significa o T do retorno baseado nos parâmetros, assim ele vai assumir que é Object e você vai ter que usar um cast, o que acaba com a ideia do generics.
tnaires
victorwss:
Possível é, mas não vai dar muito certo não.
O compilador não vai ter como determinar o que significa o T do retorno baseado nos parâmetros, assim ele vai assumir que é Object e você vai ter que usar um cast, o que acaba com a ideia do generics.
Obrigado pela resposta. Realmente, se eu pudesse chamar T.class, era só chamar o método cast da classe Class.
Então, sem usar generics, seria possível construir esse método? Caso positivo, como ficaria?
victorwss
tnaires:
victorwss:
Possível é, mas não vai dar muito certo não.
O compilador não vai ter como determinar o que significa o T do retorno baseado nos parâmetros, assim ele vai assumir que é Object e você vai ter que usar um cast, o que acaba com a ideia do generics.
Obrigado pela resposta. Realmente, se eu pudesse chamar T.class, era só chamar o método cast da classe Class.
Então, sem usar generics, seria possível construir esse método? Caso positivo, como ficaria?
Sem usar generics é simples. Mude o retorno para Object.
Eu faria alguma coisa assim:
public static <T> T convert(Class<T> classType, Object value)
Mas, se você não quiser ter este Class no parâmetro, e nem tornar a classe inteira genérica e o método ser de instância, então não tem jeito, o retorno vai ter que ser Object.
T
thingol
O método que o Victor disse que é possível declarar até existe.
thingol, eu pretendia justamente usar o Class.cast logo após obter um objeto Class referente ao className. O grande problema é obter uma instância de Class parametrizada a partir do className - e não simplesmente um Class<?>, entendeu?
tnaires
Vou explicar melhor. O código abaixo ilustra como o método deveria funcionar.
Integer convertido = convert("java.lang.Integer", value);Claro que, se o objeto “value” não fosse de fato um java.lang.Integer, ocorreria uma ClassCastException.
victorwss
[quote=tnaires]Vou explicar melhor. O código abaixo ilustra como o método deveria funcionar.