Skip to content

4.1 Create a generic class

Weverton edited this page Apr 3, 2017 · 9 revisions

Um exemplo básico de como utilizar generics:

public class Teste5 {
    
    public static void main(String[] args) {
        
        List listaAntes = new ArrayList();
        listaAntes.add("A");
        listaAntes.add(Integer.valueOf("2"));
        
        for (Object object : listaAntes) {
            String valor = (String) object; // Erro em tempo de execução
        }
        
        List<String> listaDepois = new ArrayList<>();
        listaDepois.add("A");
        listaDepois.add(Integer.valueOf("2")); // Não compila
        
    }
    
}

Alguns beneficios do Generics:

  • Remoção dos cast explicito;
  • Maior legibilidade no código;
  • Desenvolvimento de algoritmos genericos;

Exemplo de nome de parâmetro com o mesmo nome da classe:

public class Teste6 {
    
    public static void main(String[] args) {
        
        GenericClass<String> teste = new GenericClass<>();
        
        teste.getT(); // Isso é uma string não MyClass
        
    }
}

class MyClass {}

/* Mesmo o nome sendo igual a classe ele e utilizado omo parametro*/
class GenericClass<MyClass> {
    
    private MyClass t;

    public MyClass getT() {
        return t;
    }
    
}

Exemplo de herança com parametros:

public class Teste7 {
    
    public static void main(String[] args) {
        
        GenericBookParcel<String, Integer> valor = new GenericBookParcel<>();
        
    }
    
}

/*
Dessa maneira a classe não compila devido o parametro T não esta sendo enviado para a classe pai

class Parcel<T> {}
class GenericBookParcel<X> extends Parcel<T> {}

*/

/*
 * Dessa maneira funciona
 */
class Parcel<T> {}
class GenericBookParcel<X, T> extends Parcel<T> {}

Uma classe não generica herdando de uma classe generica:

public class Teste8 {

    public static void main(String[] args) {
        NoGenericClass valor = new NoGenericClass();
        System.out.println(valor);
    }
}


/*
 * Classe generica
 */
class GenericClass<T> {}

/*
 * Classe nao generica herdando de uma classe generica e passando o tipo desejado
 */
class NoGenericClass extends GenericClass<String> {}

Construtor generico:

public class Teste9 {
    
    public static void main(String[] args) {
        
        Phone<Double> teste = new Phone<>("Teste");
        
        System.out.println(teste);
        
    }
    
}

class Phone<X> {
    
    <T> Phone(T t) {
        System.out.println(t);
    }
    
}
Clone this wiki locally