Generics

5 respostas
T

Um colega meu estava mantendo um software meu que tinha a seguinte declaração:

Class &lt? extends RegularTimePeriod&gt periodClass;

Ele precisou preencher esta variável usando Class.forName:

String nomeDaClasse = ....;
periodClass = Class.forName(nomeDaClasse);

Obviamente este código precisa de um cast, mas isto provoca um warning:

periodClass = (Class &lt? extends RegularTimePeriod&gt) Class.forName(nome);

O jeito mais bobo de resolver isso é pôr um @SuppressWarnings ("unchecked") na rotina, mas isso tem cheiro de gambiarra.
Quebramos um pouco a cabeça e vimos que o correto é usar:

periodClass = Class.forName(nome).asSubclass(RegularTimePeriod.class);

que faz o cast correto.

Agora eu pergunto: isso não é complicado demais?

5 Respostas

guilherme.chapiewski

Pô, parece.

A pergunta é: esse código com Generics realmente precisava estar aí e desta forma?

Hoje mesmo eu capei um pedaço de código com Generics que tava enchendo o saco mais do que ajudando… E o seu caso está muito parecido com o meu (com cheiro de overkill).

Paulo_Silveira

nao é complicado demais nao, usar o Class.asSubclass e o Class.cast para evitar o unchecked warning ja virou idiomismo

A grande vantagem do asSubclass é que dentro dela ele faz a checagem se aquela classe é compativel com o que voce passou (usando o isAssignableFrom provavelmente). Enquanto o casting nunca daria erro naquela linha (por causa da erasure). Ai so iria dar erro bem mais pra frente ne?

guilherme.chapiewski

God bless duck typing :smiley:

louds

Isso se deve ao fato de Generics serém apenas syntax sugar e o sistema de tipos do runtime não possuir tal conceito. É o que o Paulo falou, usar cast e asSubclassOf são as maneiras de fazer reflection interagir corretamente com generics.

guilherme.chapiewski

Concordo plenamente contigo e com o Paulo. Só que é um saco :slight_smile:

Criado 14 de setembro de 2007
Ultima resposta 15 de set. de 2007
Respostas 5
Participantes 4