Métodos genéricos

9 respostas
tnaires

Bom dia.

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.

9 Respostas

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.

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

O método que o Victor disse que é possível declarar até existe.

Class.cast

Por exemplo,

Class&lt;Number&gt; numberKlass = Number.class;
Object obj = Integer.valueOf (10);
Number nr = numberKlass.cast (obj);
victorwss

thingol:
O método que o Victor disse que é possível declarar até existe.

Class.cast

Por exemplo,

Class&lt;Number&gt; numberKlass = Number.class;
Object obj = Integer.valueOf (10);
Number nr = numberKlass.cast (obj);

Em lugar nenhum ele disse que convert é sinônimo de cast.
Mas se for, daí sim, realmente é melhor usar o que a API já trás pronto.

tnaires

thingol:
O método que o Victor disse que é possível declarar até existe.

Class.cast

Por exemplo,

Class&lt;Number&gt; numberKlass = Number.class;
Object obj = Integer.valueOf (10);
Number nr = numberKlass.cast (obj);


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.

Integer convertido = convert("java.lang.Integer", value);

Daí não tem jeito. O retorno tem que ser Object neste caso.

convert("Hoje é festa lá no meu Apê", value);Como é que o compilador vai saber qual é o tipo de retorno disso?

tnaires

[quote=victorwss][quote=tnaires]Vou explicar melhor. O código abaixo ilustra como o método deveria funcionar.

Integer convertido = convert("java.lang.Integer", value);

Daí não tem jeito. O retorno tem que ser Object neste caso.

convert("Hoje é festa lá no meu Apê", value);

:smiley:
Não saberia, mas lançaria uma FestaNoMeuApeEx… ops, uma ClassCastException se não pudesse converter.

OK! Obrigado pela ajuda de todos.

Criado 5 de fevereiro de 2009
Ultima resposta 5 de fev. de 2009
Respostas 9
Participantes 3