Tudo que você deve fazer é iniciar sua Classe com class MinhaClasse<E>, agora você pode usar o E como um tipo. Quando um usuário da sua classe necessitar usar ela por exemplo com inteiros basta ele declarar uma variável dessa maneira <em>MinhaClasse<int> m = new MinhaClasse<int>.
Abaixo o exemplo completo:
public class MinhaClasse<E extends Comparable> {
private E valor1;
private E valor2;
public MinhaClasse() {
}
public MinhaClasse(E valor1, E valor2) {
this.valor1 = valor1;
this.valor2 = valor2;
}
public E getValor1() {
return valor1;
}
public void setValor1(E valor1) {
this.valor1 = valor1;
}
public E getValor2() {
return valor2;
}
public void setValor2(E valor2) {
this.valor2 = valor2;
}
public void maior() {
if(valor1.compareTo(valor2) > 0)
System.out.println("O maior valor e: " + valor1);
else if(valor2.compareTo(valor1) > 0)
System.out.println("O maior valor e: " + valor2);
System.out.println("Sao iguais");
}
public boolean iguais()
{
return valor1.equals(valor2);
}
public void menor()
{
if(valor1.compareTo(valor2) < 0)
System.out.println("O menor valor e: " + valor1);
else if(valor2.compareTo(valor1) < 0)
System.out.println("O menor valor e: " + valor2);
System.out.println("Sao iguais");
}
}
Declaramos uma classe que aceitrá qualquer tipo que tenha sido derivada da classe Comparable. Isso servirá para podermos utilizar a função compareTo(object o), esta função compara o valor da esquerda com o valor da direita e retorna -1 se o valor da esquerda for menor, 1 caso seja maior e 0 se forem iguais. Poderíamos usar diretamente os operadores < e > porém isso não é aconselhável com String. Todos os tipos primitivos já são derivados dessa classe ou tem implementado as funções da interface IComparable.
Para comparar se são iguais utilizamos a função já definida pelo JAVA equals(object o) que retorna true caso sejam iguais.
Agora é só utilizarmos nossa nova classe:
public class Main {
public static void main(String[] args) {
// declara uma variavel que so aceitara inteiros
MinhaClasse<Integer> mi = new MinhaClasse<Integer>(34, 12);
mi.maior();
mi.menor();
if(mi.iguais())
System.out.println("Sao iguais");
// declara uma varivel que so aceitara strings
MinhaClasse<String> ms = new MinhaClasse
ms.maior();
ms.menor();
if(ms.iguais())
System.out.println("Sao iguais");
// declara uma variavel que aceitara qualquer tipo
MinhaClasse mg = new MinhaClasse();
mg.setValor1(34.5);
mg.setValor2(34.5);
mg.maior();
mg.menor();
if(mg.iguais())
System.out.println("Sao iguais");
}
}
Nossa primeira variável trabalhará apenas com inteiros, repare que declaramos Integer e não int isso porque é a classe Integer que é derivada da classe Comparable. Nossa segunda variável poderá apenas trabalhar com String.
Ja nossa terceira variável poderá trabalhar com qualquer tipo, isso é permitido, chamamos isso de tipo bruto, isto é, não sabemos quais são os tipos que está armazenado seja na variável valor1 ou na variável valor2. Deve-se tomar muito cuidado quando se trabalhar com tipos brutos, por exemplo, mude qualquer uma da atribuição de um valor para string setValor1("Palavra"); e veja o que acontece. Para evitar esta excessão sua classe deve evitar essa comparação, essa é uma das prioridades quando se quer criar uma classe genérica. Faça isso como exercício, compare os tipos e permita ou não a utilização da função compareTo(object o) entre eles.
Você viu como é simples criar uma classe genérica em JAVA, e também que se deve ter alguns cuidados quando criá-la, espero que tenha entendido o conceito.
Boa sorte.