Início > Programação > Como Criar uma Instância de um Tipo Genérico

Como Criar uma Instância de um Tipo Genérico

Uso extensivamente os tipos genéricos do Java. Pude comprovar, comparando com códigos bem mais antigos que fiz, que os genéricos minimizam o uso de casting, algo muito comum em linguagens fortemente tipadas como o Java. Por outro lado, os genéricos engessam um pouco nossa arquitetura e trazem alguns novos desafios, como por exemplo a instanciação do tipo genéricos, que é o foco desse artigo.

Você deve utilizar reflections para descobrir a classe do tipo genérico que será instanciado. Para exemplificar, vamos partir de uma hierarquia de classes simples que será utilizada para compôr uma outra hierarquia com genéricos:

public abstract Documento {
}

public CPF extends Documento {
}

A superclasse Pessoa define um tipo genérico “D” que estende a classe Documento. A classe PessoaFisica assume que Documento é CPF:

public abstract class Pessoa<D extends Documento> {
}

public class PessoaFisica extends Pessoa<CPF> {
}

Por fim, vamos escrever uma classe que utilizará reflections para descobrir e instanciar o tipo genérico:

public class Teste {
   public static void main(String ars[]){
      Type superClass = PessoaFisica.class.getGenericSuperclass();
      ParameterizedType pType = (ParameterizedType) superClass;
      for (Type tipo : pType.getActualTypeArguments()) {
         Class clazz = (Class) tipo;
         if (Documento.class.isAssignableFrom(clazz)) {
            Documento documento = (Documento) clazz.newInstance();
         } 
      }
   }
}

Como partimos da subclasse PessoaFisica, o tipo genérico Documento instanciado é um CPF.

Referências

1. [http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java]
2. [http://stackoverflow.com/questions/3437897/how-to-get-a-class-instance-of-generics-type-t]
3. [http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime]

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: