Dúvida sobre generics

Pessoal

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.

Escrevi a seguinte assintura:

public <T, N extends T> T meuMetodo(Class<T> intf, Class<N> subinterface) { ... }

Com esta assinatura eu consigo passar para o método tanto:

 AInterface retorno = meuMetodo(AInterface.class, ASubinterface.class); 

quanto:

 AInterface retorno = meuMetodo(AInterface.class, AInterface.class); 

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.

Será que isso é possível via generics?

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&lt? super T&gt 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&lt? extends T&gt 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 &lt- Number
        eg.meuMetodo2 (Number.class, Integer.class); // Number -&gt Integer
        eg.meuMetodo1 (Integer.class, Integer.class); // Integer &lt- Integer
        eg.meuMetodo2 (Number.class, Number.class); // Number -&gt Number
    }
}