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
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.
Abaixo outro exemplo: tirado do javaranch
[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
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.