Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
softklin

[Resolvido] Classe com argumentos de tipo genérico a implementar uma interface

Recommended Posts

softklin

Boas pessoal. Encontro-me de momento a fazer uma pequena classe que vai ser transmitida pela rede. De forma a que esta seja transmitida, tenho que implementar a interface Serializable.

Surgiu-me a necessidade de passar conteúdos arbitrários nessa mensagem, pelo que considerei fazer a classe com um tipo genérico, algo assim:

public class Email<T> implements Serializable {
  ...
  private T data;
  ...
}

Agora, o que queria garantir era que este T também implementava a interface Serializable, também para poder transmitir este tipo na rede. No entanto, não estou a conseguir.

public class Email<T implements Serializable> implements Serializable

Isto não é válido, e pelo que andei a pesquisar, dizem que não é possível fazer isso. Alguém tem alguma dica sobre como garantir que o tipo genérico implementa aquela interface?

Cumps.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
magician

Isso é possivél fazer mas é com subclass no caso de interfaces julgo que não é possivél :S

Uma forma de "contornar" o problema talvez seja forçar a que os objectos a transmitir sejam mesmo Serializable, ou seja onde tens T meter mesmo Serializable.


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
Baderous

Nas classes genéricas, as restrições dos tipos parâmetro são feitas através da keyword extends, inclusivé para interfaces, contrariamente ao que seria expectável. Nestas situações, essa keyword pode representar herança (quando o nome que se lhe segue é o de uma classe), implementação (quando o nome que se lhe segue é o de uma interface), subtipo (quando o nome que se lhe segue é o de uma classe que representa um subtipo na hierarquia de tipos parametrizados) ou igualdade (quando o nome que se lhe segue é o de uma classe final que, não podendo ter subclasses, limita o tipo parâmetro ao tipo da classe final).

Portanto, no teu caso, terás:

public class Email<T extends Serializable> implements Serializable

Caso pretendas que T seja subclasse de alguma classe e/ou implemente várias interfaces, tens a seguinte sintaxe:

public class Email<T extends A & B & C> ...

Onde A pode ser uma classe ou interface, e B e C são interfaces.

Share this post


Link to post
Share on other sites
softklin

É isso mesmo, funcionou bem. Na verdade já tinha visto soluções que utilizavam o extends, mas pensei que era apenas no caso de subclasses, nem cheguei a experimentar.

Muito obrigado a ambos pela ajuda ;)


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.