Utilizando o Generics para instanciar objetos

10 respostas
B

E aí pessoal. blz ?

Seguinte, estou querendo fazer algo assim, porem nao compila:

class A<T extends Object>
{
  private T objeto;
  
  public A()
  {
    objeto = new T();
  }
}

Tem como fazer isso ou não ?

VLW

10 Respostas

Paulo_Silveira

infelizmente não… voce nao sabe o tipo T em tempo de execução… (perceba que voce tambem nao saberia se T tem um construtor default)

voce vai precisar receber essa Class tambem como argumento… do mesmo jeito como em um dao genério.

http://blog.caelum.com.br/2007/04/08/generics-inferencia-de-tipos-e-reificacao-no-java-7/

B

Paulo Silveira:
infelizmente não… voce nao sabe o tipo T em tempo de execução… (perceba que voce tambem nao saberia se T tem um construtor default)

voce vai precisar receber essa Class tambem como argumento… do mesmo jeito como em um dao genério.

http://blog.caelum.com.br/2007/04/08/generics-inferencia-de-tipos-e-reificacao-no-java-7/

Kra, muito obrigado pela sua resposta, porem, nao consegui entender muito bem o que deve ser feito.

Tem como você colocar um exemplo ?

VLW

Marcio_Duran
baison:
Kra, muito obrigado pela sua resposta, porem, nao consegui entender muito bem o que deve ser feito.

Tem como você colocar um exemplo ?

:?: hummmm!!!!

:shock: Opssss, algo aleatório !!!!!
class Object<T>{

   private T objeto;

   Object(T t){

   this.objeto=t;
}

class A<T extends Object>  
     {  
      private T objeto;  

      public A( Object<T> type ) throws Exception  
     {  
      this.objeto = type.newInstance();          

      {  

      }  
}
:arrow: Um exemplo no GUJ mesmo, acho que esse é menos abstrato que os demais Já citados
import org.springframework.orm.jpa.support.JpaDaoSupport;  
      
public class DAO<T> extends JpaDaoSupport{  
          
        public T save(T t){  
            getJpaTemplate().persist(t);  
            return t;  
        }  
          
       public T update(T t){  
           return getJpaTemplate().merge(t);  
       }  
         
       public void delete(T t){  
           getJpaTemplate().remove(t);  
       }  
}

[size=18]Generic class declarations[/size]

:idea: Busque as regras dessa aplicação de Genéricos no Livro da Kathy Sierra/Bert Bates
Existem diferentes tipos de sintaxe genérica (Capítulo 7:Genéricos e Conjuntos Página 330)

No Forum Javaranch tem exemplos interessantes fora o embate técnico é de alto nível.

[url]http://saloon.javaranch.com[/url]

Abaixo outro exemplo: tirado do javaranch :wink:

public class Fruit<E extends Fruit<E>> implements Comparable<E>
{
   public int compareTo(E other)
   {
      return 0;
   }
 
   public static void main(String[] args)
   {
      Apple a1 = new Apple();
      Apple a2 = new Apple();
      int compApps = a1.compareTo(a2);//Passes compilation
 
      Pear p = new Pear();
      int compAppAndPear = a1.compareTo(p); //Compilation error
 
      Fruit<Apple> f1 = new Apple();
 
      int compFruitAndApple = f1.compareTo(a1); //Passes compilation
      int compAppleAndFruit = a1.compareTo(f1); //Compilation error
 
      Fruit<Apple> f2 = new Apple();
      int compFruits = f1.compareTo(f2); //Compilation error
 
   }
}
 
class Apple extends Fruit<Apple>
{
}
 
class Pear extends Fruit<Pear>
{
}
Mauricio_Linhares

baison:
Kra, muito obrigado pela sua resposta, porem, nao consegui entender muito bem o que deve ser feito.

Tem como você colocar um exemplo ?

O que o paulo disse é que pra fazer o que você quer tem que ser alguma coisa assim:

class A<T extends Object>
{
  private T objeto;
  
  public A( Class<T> type ) throws Exception
  {
    this.objeto = type.newInstance();
  }
}
ViniGodoy

Embora isso acabe com a segurança em tempo de compilação. Por exemplo, se você mudar o construtor, esse código só dará erro em Runtime.
Isso também é problemático se usa classe também precisar de generics.

Infelizmente, generics não são os templates do C++. Se fossem, dava para fazer isso tranquilo.

B

Pois é… em C++ é trank.

Mas blz… vlw pelas respostas.

Mauricio_Linhares

O que? Genéricos?

Genéricos em Java não existem, isso é intriga da oposição :lol:

É realmente uma pena que os genéricos do Java sejam são simplórios :frowning:

Paulo_Silveira

Se voce mudar o construtor, nao vai nem compilar… nao é tao ruim assim nao

Mauricio_Linhares

Acho que o Viny se referiu ao contrutor de T Paulo, se você mudar ele (ou remover o construtor default) o código compila perfeitamente, mas vai lançar uma exeção em tempo de execução.

ViniGodoy

Acho que o Viny se referiu ao contrutor de T Paulo, se você mudar ele (ou remover o construtor default) o código compila perfeitamente, mas vai lançar uma exeção em tempo de execução.

É isso mesmo.

Usando reflexão, você abre mão da verificação do compilador. É uma desvantagem importante, que muita gente esquece de levar em conta na hora de dizer se vale ou não à pena usar o recurso.

Criado 18 de fevereiro de 2008
Ultima resposta 19 de fev. de 2008
Respostas 10
Participantes 5