Generics[RESOLVIDO]

Oi pessoal, estou aqui novamente enchendo o saco de vcs…

Chamada de metodos com generics

public class Test {
   public <T extends Comparable> T findLarger(T x, T y) {
        if (x.compareTo(y) > 0) {
            return x;
        } else {
            return y;
        }
    }
}


Test t = new Test();

a - Object x = t.findlarger(123,“456”);
b - int x = t.findlarger(123, new Double(456));
c - int x = t.findlarger(123, new Integer(456));
d - int x = (int) t.findlarger(new Double(123), new Double(456));

segundo o simunlado as respostas certar são A e C, mas a minha dúvida é: o metodo retorna uma implementação de compratable, mas int não implementar comparable, ai pensei que ele pode estar fazendo o cast, mas dessa forma a letra B também estaria certa, mas não esta…
alguem pode me explicar por favor?

abraço


Se conseguir ler em inglês de boa, aqui tem uma explicação pra essa resposta:
http://www.coderanch.com/t/268309/java-programmer-SCJP/certification/Generics-SCJP

O tipo de T será definido pelos parâmetros, e será escolhido o tipo mais específico que sirva para os dois parâmetros.

Na letra A, o tipo escolhido será Comparable (ou Object, já que todo objeto extends Object). É o único tipo comum entre String e Integer.

Na letra B, será escolhido o tipo Number. Integer e Double estendem Number. Logo, o retorno é Number. O retorno Number, não necessariamente será um int ou Integer.
Seria o memo que fazer:
Number n;
Integer i = n; //não compila

Na letra C, será escolhido o tipo Integer, que atende aos dois parâmetros. Compila pois o retorno também será Integer.

Na Última opção o retorno será Double. E não é possível fazer cast de Double para Integer (ou int).

Obs: O Java converte de int para Integer e vice versa automaticamente. Essa funcionalidade chama-se autoboxing.
Obs2: As respostas do link do colega contém erros.

deixa ver se entendi…

a letra C não vai compilar mesmo pois não de fazer cast de Double para int.

lentra A estou mandando um Integer (que esta sendo feito o autoboxing) e uma string, mas não tem problema qual dos dois retornar pq estou atruindo a um object

a minha dúvida era por que a lentra B não compilava e a letra C compila se as duas retornam são atribuidas a um int. Então a diferença é que C compila pois, esta sendo feito um autoboxing de 123 para Integer combinado com o outro Integer 456 vai retonar somente um Integer e irá fazer o unboxing para int.
e a B não compila pois esta mandando um Double, dessa forma o tipo mais específico não dá de fazer cast para int…

acho que ficou claro agora.
Obrigada

Só esclarecendo um pouco mais…

A letra B não compila, pois está sendo passado um Integer e um Double. O tipo comum entre os dois é Number. Logo o retorno é Number.
Não é possível atribuir um objeto Number a uma variavel Integer.