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
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.