Olá Pessoal, tudo bom?
O artigo de hoje está relacionado a um erro de compilação que existe no Java a partir de uma hierarquia de tipos e a utilização de Generics sobre esta.
Descrição do Erro
Quando existe uma hierarquia cuja declaração desta utiliza-se de Generics, se o que está explicitado na declaração não for realizado irá ocorrer o erro de not valid substitute . Vamos criar algumas classes para emularmos o erro. Primeiramente vamos criar uma interface, de nome InterfaceGenerics, que possua um código de criação com Generics. Veja o código abaixo:
1 2 3 4 5 6 7 8 9 |
package br.com.mauda.generics; import java.io.Serializable; public interface InterfaceGenerics <T extends Serializable> { T getInstancia(); } |
Essa interface possui um tipo T que necessita implementar a Interface java.io.Serializable. Se você está ciente de heranças sabe que o extends se aplica quando estamos criando uma filha de uma classe. No caso do Generics ambos os casos, implementação de uma interface ou extensão de uma classe são tratadas pela palavra chave extends.
Agora vamos criar uma classe básica, de nome PojoBasico, que não implemente a interface java.io.Serializable.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package br.com.mauda.generics; public class PojoBasico { private String nome; public PojoBasico() { } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } |
Não há mistério aqui, apenas uma classe básica. Agora vamos criar uma classe de nome Implementadora, que realiza a implementação da InterfaceGenerics. Repare que o código irá incluir a classe PojoBasico na linha da declaração da classe
1 2 3 4 5 6 7 8 9 10 |
package br.com.mauda.generics; public class Implementadora implements InterfaceGenerics<PojoBasico> { @Override public PojoBasico getInstancia() { return new PojoBasico(); } } |
Nesse momento você terá um erro de compilação com a seguinte mensagem:
Bound mismatch: The type PojoBasico is not a valid substitute for the bounded parameter <T extends Serializable> of the type InterfaceGenerics<T>
Isso quer dizer o seguinte:
O tipo PojoBasico não está sendo um substituto correto para o parâmetro T que o tipo InterfaceGenerics declara, ou seja, o tipo PojoBasico necessita implementar a interface Serializable para que não ocorra erros de compilação.
Solução
Entendido o que o erro significa fica mais tranquilo saber o que fazer para que o código funcione. No caso do exemplo aqui é necessário que a classe PojoBasico implemente a interface java.io.Serializable. Veja isso no código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package br.com.mauda.generics; import java.io.Serializable; public class PojoBasico implements Serializable{ private static final long serialVersionUID = -8509243341606104717L; private String nome; public PojoBasico() { } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } |
Pronto agora o erro de compilação que estava acontecendo deixará de acontecer!
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply