Genericos O.o <? extends T> e <? super T>

axo q resposta é não… mas vamos a pergunta é possivel restriginer um parametro que esteja na linha de <T> tanto para super ? como para extends? ou seja… so poderiam entrar ou <? extends T> ou <? super T>

a duvida é pq eu só queria receber em uma parametros os valores ou que fossem do mesmo tipo, ou supertipos ou subtipos… mas nunca fora da arvore da tipologia…

por exemplo, se T fosse Number então so seriam aceitos, Objects, Numbers, Integer, Long, Double, … etc … ou seja… os supertipos o proprio tipo e os subtipos… … porem nunca uma String por exemplo que é de outra arvore de tipologia

eu so consigo ou restringir para cima… Object e Number… ou restringir para baixo… Number e seus descendentes…

Alguem sabe alguma forma de juntar tudo ?? na tipologia ? …

Seria algo com funciona o cast em tempo de compilação

Number n = null;

é possivel usar casta para cima e para baixa na tipologia porem nunca fora da hieraquia…

Object o = (Object)n;
Object o = (Number)n;
Object o = (Integer)n;
Object o = (Double)n;

tudo isso compila, porem Object o = (String)n; não compila, pois String não faz parte da hieraquia de Number

espero q meu post seja claro

Esse é um exemplo de comparação de tipos iguais


public class MyGeneric
{

     public MyGeneric() {}

     public static  < T extends comparable< T > >  T  maximum( T given1, T given2, T given3 )
     {
          T max = given1; 

          if ( given2.compareTo( max ) > 0 )
              max = given2;

          if ( given3.compareTo( max ) > 0 )
             max = given3;

          return max;
     }

     public static void main( String args[] )
     {
           System.out.printf( "Maximum of  %d, %d and %d  is  = %d \n\n", 2, 3, 4, 
                   maximum( 2, 3, 4 ) );

           System.out.printf( "Maximum of  %.1f, %.1f and %.1f  is = %.1f \n\n", 5.2, 6.2, 7.2, 
                   maximum( 5.2, 6.2, 7.2 ) );

           System.out.printf( "Maximum of %s, %s and %s  is = %s \n\n", "Ah", "Eh", "Ohh", 
                   maximum( "Ah", "Eh", "Ohh" );

     }

}

vc não entendeu… eu kero uma restrição assim

public &lt;T&gt; T findFirst(Collaction&lt;X&gt; candidates, Criterion&lt;T&gt; criterion) { //.... aki não importa o que tem }

o X tem q ser algo na hieraquia do T … não pode ser nada fora da Hieraquia… por exemplo

[code]Criterion<Number> criterioNumber;

Collection<Object> lista; //<== permitido
Collection<Number> lista; //<== permitido
Collection<Integer> lista; //<== permitido
Collection<Double> lista; //<== permitido
Collection<String> lista; //<== NÃO PERMITIDO

Number n = findFirst(lista, criterioNumber);[/code]

o motivo de String não ser permitido, é pq é imposivel achar em uma lista de Strings, alguma coisa que bata com um criterio de Number, porem uma lista de Objetos pode conter um Number, o mesmo para Integer, Double …

Entenda que number é apenas um exemplo, não quer dizer q precisa ser um Number, pode ser qualquer objeto, Horse, Animal, Car … etc… so queria poder especificar que akele <X> é na hieraquia de T

veja isso:


public < T, S extends T > void test( T a, S b ) {}

ja falei q não é isso… eu precisava de algo tanto para extends como para super… fazer só extends, ou só super eu sei fazer… keria no mesmo campo aceitar os 2