boa tarde,
estou fazendo uma interface chamada dataset, e gostaria q todas as minhas classes DAO implementassem essa interface…
os metodos sao algo como
insert
update
delete
getList
getItem
o problema é que: por exemplo, o insert fica:
public Object insert(Object objeto)
isso mas gostaria que ao invez de explicitar Objeto eu deixasse um curinga ai para ficar mais ou menos assim:
public ? extends Object insert(? extends Object objeto)
ou simplesmente
public ? insert(? object);
e então nas classes concretas eu especificaria a classe
public Pessoa insert(Pessoa objeto);
será que tem como?
obrigado
Está utilizando algum framework ORM ou jdbc puro?
estou utilizando puro… e gostaria que fosse assim pra pegar as manhas… hehe
Se fosse com framework seria bem simples.
Com jdbc puro, sugiro criar uma interface para cada DAO isolado. Afinal, o tipo de argumento de métodos como insert, delete e update seria mais específico, não te obrigando a fazer conversões ou utilizar reflection
pmlm
Dezembro 15, 2011, 11:35am
#5
public <T> T insert(T object)
evefuji
Dezembro 15, 2011, 11:36am
#6
Se vai usar reflection, já pesquisa e usa hibernate então…
hum, interessante esse reflection… vou tentar com ele e posto o resultado aqui…
esse não deu certo… eu ja tinha tentado…
outra coisa q tentei foi criar uma interface tb para as minhas classes…
class Pessoa implements IPersistable
class Produto implements IPersistable
e os meus DAOs ficariam
public IPersistable insert(IPersistable objeto);
acho que a modelagem ficaria boa, digo sem gambiarras…
mas tb nao adiantou muito, pq d qq jeito tenho q dar cast pra todo lado…
agora me digam: esse reflection num é considerado gambiarra nao? hehe
valeu
Reflection não é gambiarra, é uma solução de alto nível. Agora, seria o mesmo que caçar coelho com rifle para elefante…
Vc deve ter feito algo errado, pois dessa forma deveria funcionar. De uma olhada nesse código.
[code]public class GUJ1 {
public static class Test {
public <T> T insert(T t) {
System.out.println("Inserting: " + t);
return t;
}
}
public static void main(String[] args) {
Test t = new Test();
Integer i = t.insert(Integer.valueOf(1));
String s = t.insert("Test");
Object o = t.insert(null);
List<Map<String, String>> list = t.insert(new ArrayList<Map<String, String>>());
System.out.println("... " + i);
System.out.println("... " + s);
System.out.println("... " + o);
System.out.println("... " + list);
}
}[/code]
Vc deve ter feito algo errado, pois dessa forma deveria funcionar. De uma olhada nesse código.
[code]public class GUJ1 {
public static class Test {
public <T> T insert(T t) {
System.out.println("Inserting: " + t);
return t;
}
}
public static void main(String[] args) {
Test t = new Test();
Integer i = t.insert(Integer.valueOf(1));
String s = t.insert("Test");
Object o = t.insert(null);
List<Map<String, String>> list = t.insert(new ArrayList<Map<String, String>>());
System.out.println("... " + i);
System.out.println("... " + s);
System.out.println("... " + o);
System.out.println("... " + list);
}
}[/code][/quote]
hum, talvez tenha feito errado mesmo… se funcionar assim vai ficar muito bom…
quando chegar em casa vou testar,
valeu pessoal
Cara, o
funcionou 100%, ficou do jeitinho que eu queria, mas poderia me explicar oq é esse T? eu vi que posso substituir por qq coisa, mas oq ele representa?
obrigado…
o reflection eu nem cheguei a testar já que essa solução me atendeu bem
Esse recurso é chamado de Generics. Mais informações aqui
Você pode pensar no T como uma variável que contém um tipo.
Na hora de usar a função, você diz qual tipo exatamente usará.
Importante notar, que o T é só uma convenção, poderia usar outras letras.
No seu caso, seu método insert aceita qualquer tipo, mas ele sempre retornará uma variável do mesmo tipo passado como parâmetro.