[RESOLVIDO] public ? insert(? object);

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

 public <T> T insert(T object)

usa Reflexion: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

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.

hum, massa…

valeu pessoal