Utilizando o Generics para instanciar objetos

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

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/

[quote=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/
[/quote]

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

Tem como você colocar um exemplo ?

VLW

[quote=baison]
Kra, muito obrigado pela sua resposta, porem, nao consegui entender muito bem o que deve ser feito.

Tem como você colocar um exemplo ?[/quote]

:?: 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

[code] import org.springframework.orm.jpa.support.JpaDaoSupport;

public class DAO 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);  
   }  

} [/code]

[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.

http://saloon.javaranch.com

Abaixo outro exemplo: tirado do javaranch :wink:

[code]public class Fruit<E extends Fruit> implements Comparable
{
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
{
}

class Pear extends Fruit
{
}
[/code]

[quote=baison]Kra, muito obrigado pela sua resposta, porem, nao consegui entender muito bem o que deve ser feito.

Tem como você colocar um exemplo ?[/quote]

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();
  }
}

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.

Pois é… em C++ é trank.

Mas blz… vlw pelas respostas.

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:

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

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.

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.[/quote]

É 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.