Solução com generics

9 respostas
danielbchaves

Gostaria de implementar uma classe que fosse mais ou menos assim…

public class MinhaClasse<T>
{
	public void adicionar( T obj )
	{
	}
}

Gostaria de que o T só pudesse ser um objeto da interface X, teria como fazer isso? Pois se eu colocar o nome da interface no lugar do T não muda nada, ali é só um nome e tanto faz o que escrevo

Alguém sabe se tem como fazer ou alguma sugestão?

[]s

9 Respostas

Dieval_Guizelini

Você já tentou:

public class MinhaClasse { public void adicionar( <? implements X> obj ) { } }

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

fw

scarton

Dieval Guizelini:
Você já tentou:

public class MinhaClasse { public void adicionar( <? implements X> obj ) { } }

O correto não seria

public class MinhaClasse { public void adicionar( <? extends X> obj ) { } }

mesmo X sendo uma interface?

abraços

Dieval_Guizelini

scarton:
Dieval Guizelini:
Você já tentou:

O correto não seria

public class MinhaClasse { public void adicionar( <? extends X> obj ) { } }
mesmo X sendo uma interface?
abraços

Scarton,

depende do que você quer, se quiser uma subclasse é extends, se quiser uma classe que implementa um interface é implements mesmo.

Conforme a declaração do danielbchaves:

E conforme o link que passei:

<blockquote>

2 Defining Simple Generics

Here is a small excerpt from the definitions of the interfaces List and Iterator in package

java.util:

public interface List { void add(E x);

Iterator iterator();

}public interface Iterator { E next();

boolean hasNext();

}

This should all be familiar, except for the stuff in angle brackets. Those are the

declarations of the formal type parameters of the interfaces List and Iterator.</blockquote>

ok

scarton

Olá Dieval,

estou estudando para a certificação e no livro da Kathy diz q é extends mesmo que seja uma interface…

<blockquote>First, the <? extends Animal> means that you can take any subtype of Animal;

however, that subtype can be EITHER a subclass of a class (abstract or concrete)

OR a type that implements the interface after the word extends. In other words,

the keyword extends in the context of a wildcard represents BOTH subclasses and

interface implementations. There is no <? implements Serializable> syntax. If

you want to declare a method that takes anything that is of a type that implements

Serializable, youd still use extends like this:

void foo(List<? extends Serializable> list) // odd, but correct
// to use “extends”

Observe q neste exemplo foi utilizado extends para a interface Serializable, entao no exemplo do nosso amigo não seria <? extends X> mesmo ?

abraços

Paulo_Silveira

a sintaxe é extends no generics independente se é interface ou classe mesmo… até porque voce pode aceitar mais de um argumento (T extends Runnable, X, Y)

Giulliano

Dieval Guizelini:
Você já tentou:

public class MinhaClasse { public void adicionar( <? implements X> obj ) { } }
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

ai forçou a amizade…rss…

danielbchaves

vamos lá, pelo que entendi não poderia usar algo do tipo

public class MinhaClasse&lt;T&gt; {
	public void adicionar( &lt;T extends MinhaInterface&gt; obj )
	{
	}
}

para dizer que quero qualquer objeto que implemente a minha interface,

só vou poder usar isso para dizer que uma collection recebida como parâmetro contenha somente objetos do tipo MinhaInterface

public void adicionar( List&lt;T extends MinhaInterface&gt; obj )
	{
	}

é isso mesmo?

sergiotaborda

danielbchaves:
Gostaria de implementar uma classe que fosse mais ou menos assim…

public class MinhaClasse<T>;
{
	public void adicionar( T obj )
	{
	}
}

Gostaria de que o T só pudesse ser um objeto da interface X, teria como fazer isso? Pois se eu colocar o nome da interface no lugar do T não muda nada, ali é só um nome e tanto faz o que escrevo

public class MinhaClasse<T extends X>;
{
	public void adicionar( T obj )
	{
	}
}

// ou

public class MinhaClasse;
{
	public <T extends X> void adicionar( T obj )
	{
	}
}

Dependendo se é a classe que é tipada ou apenas o método. Mas para o método seria mais facil simplesmente

public class MinhaClasse; { public void adicionar( X obj ) { } }

danielbchaves

bom… essa última pergunta foi mal projetada, esqueçam ela…

Aproveitando a deixa…

public class MinhaClasse&lt;T&gt;

dentro do meu código, como posso saber qual a classe que é T quando o objeto for criado?

Criado 8 de junho de 2008
Ultima resposta 9 de jun. de 2008
Respostas 9
Participantes 6