Chamada de métodos primitivo, wrappers, var-args

4 respostas
J

Seguinte código:

class etattva105 { public static void check(Double d1, Double ... d2) { System.out.println("Double , Var-Args"); } public static void check(Double d1, Double d2, Double ... d3) { System.out.println("Double , Double , Var-args"); } public static void check(double d1, Double d2, Double ... d3) { System.out.println("double , Double , Var-args"); } public static void main(String [] args) { check(12.3, 21.9, 37.7); // line 1 } }
A. Compilation fails.
B. Compiles fine and produces output “double , Double , Var-args”.
C. Compiles fine and produces output “Double , Var-Args”.
D. Compilation suceeds when line 1 is removed.
E. Compiles fine and produces output “Double , Double , Var-args”.

Eu marquei a “B” como resposta correta… mais ele fala que é a “A” e a “D”

Alguém poderia me explicar isso, sei que as prioridades são 1° primitivo 2° wrappers 3° var-args, mais em qualquer mistura entre eles, qual método será chamado acontece em tempo de execução???

4 Respostas

victorwss

A chamada ao método check é ambígua. O segundo e o terceiro podem ser chamados. Por isso o compilador dá erro. Letra A está correta, e por isso B, C e E são erradas.

Quanto a D, é fácil. A linha que tem o erro e a chamada ambígua ao método check. Removendo essa linha ele compila. Letra D está correta.

J

então esso aqui seria o mesmo caso?

class Fruit {} class Apple extends Fruit {} public class etattva110 { public static void useMe(Fruit... f) { //erro System.out.print("Fruit Var-Args" + " "); } public static void useMe(Apple... f) { //erro System.out.print("Apple Var-Args" + " "); } public static void useMe(Apple[] a) { //erro System.out.print("apple array" + " "); } public static void useMe(Fruit[] f) { //erro System.out.print("fruit array" + " "); } public static void main(String[] args) { useMe(new Fruit[] { new Apple(), new Fruit() }); //erro useMe(new Apple[] { new Apple(), new Apple() }); //erro } }

victorwss

Quase. É porque varargs é um syntahic sugar para parâmetro array. Daí Fruit… vira Fruit[], o que faz ter dois métodos com a mesma assinatura. Apple… vira Apple[], mais dois métodos com a mesma assinatura.

LPJava

exato. Vc pode passar 2.0 para o tipo de arg que seja Double entao o compilador nao vai diferenciar double de Double nesse caso do args… 2.0, 5.0 é isso em qualquer situação tanto se for primitivo quanto wrapper…

Se mudar o nome do metodo compila normal!

Criado 6 de maio de 2008
Ultima resposta 6 de mai. de 2008
Respostas 4
Participantes 3