E eu queria restringir o segundo parâmetro via generics a somente aquelas interfaces que estendessem diretamente a interface passada no primeiro parâmetro, ou pelo menos restringir para que não se conseguisse passar a mesma interface do primeiro parâmetro no segundo.
import java.util.*;
class ExemploGenerics {
/*
Quero escrever um método que:
* Receba um parâmetro Class de um tipo T (na verdade uma interface).
* Receba um segundo parâmetro Class que necessariamente seja uma subclasse (no meu caso subinterface) do tipo T.
* Retorne o tipo T.
E eu queria restringir o segundo parâmetro via generics a somente aquelas
interfaces que estendessem diretamente a interface passada no primeiro parâmetro,
ou pelo menos restringir para que não se conseguisse passar a mesma interface do
primeiro parâmetro no segundo.
*/
//-- Não é possível fazer o desejado só com generics. Você precisa testar
//-- as interfaces para igualdade se esse é o caso.
public <T> T meuMetodo1(Class<T> intf, Class<? super T> superinterface)
throws InstantiationException, IllegalAccessException {
if (intf.equals (superinterface))
throw new RuntimeException ("Não pode passar a mesma interface ou classe");
return null;
}
public <T> T meuMetodo2(Class<T> intf, Class<? extends T> subinterface) throws
InstantiationException, IllegalAccessException {
if (intf.equals (subinterface))
throw new RuntimeException ("Não pode passar a mesma interface ou classe");
return null;
}
public static void main(String[] args) throws Exception {
ExemploGenerics eg = new ExemploGenerics();
eg.meuMetodo1 (Integer.class, Number.class); // Integer <- Number
eg.meuMetodo2 (Number.class, Integer.class); // Number -> Integer
eg.meuMetodo1 (Integer.class, Integer.class); // Integer <- Integer
eg.meuMetodo2 (Number.class, Number.class); // Number -> Number
}
}