Pessoal, me ajudem por favor a interpretar uma questão. Fiz o exercício e não entendi nada sobre essa questão - por fim deixei pra voltar nela depois e fiz bem pois quando fui ver não sei pq motivos enfiaram uma questão do capítulo 3 no capítulo 2. Eu precisaria de conceitos do capítulo 3 antes de fazer esse exercício. Sacanagem. Enfim segue:
class A { }
class B extends A { }
public class ComingThru {
static String s = "-";
public static void main(String[] args) {
A[] aa = new A[2];
B[] ba = new B[2];
sifter(aa);
sifter(ba);
sifter(7);
System.out.println(s);
}
static void sifter(A[]... a2) { s += "1"; }
static void sifter(B[]... b1) { s += "2"; }
static void sifter(B[] b1) { s += "3"; }
static void sifter(Object o) { s += "4"; }
}
What is the result?
A. -124
B. -134
C. -424
D. -434
E. -444
F. Compilation fails
D is correct. In general, overloaded var-args methods are chosen last. Remember that arrays are objects. Finally, an int can be boxed to an Integer and then “widened” to an Object.
No cap. 3 vi que metodos var-args são fracos, e vendo a resposta vi que falaram em boxing e widening.
Mas eu achei que essa sobrecarga de métodos, a preferência por fazê-los seria no caso de não haver uma correspondencia qto aos argumentos passados.
Por exemplo
fazQualquerCoisa(int x, int y);
fazQualquerCoisa(Integer x, Integer y);
fazQualquerCoisa(4,5);
Sendo assim seria escolhido o primeiro método pois há correspondência não sendo necessário fazer boxing.
Voltando ao exercício: O método a ser chamado na questão não seria este: static void sifter(B[] b1) { s += "3"; } pois espera um array e há correspondência, quando se passa sifter(aa); sifter(ba); Também estou estranhando que em um método é passado um array e no outro é passado um inteiro -sifter(7);- e estes chamam os mesmos métodos gerando 4 no print. O outro que chama tb um array por sua vez gera o 3. Me ajudem por favor porque essa questão, tá mto difícil. Qdo são simples var-args sei que são lidos método(int…x) - método recebe de 0 a alguns inteiros. Mas e nesse caso, como leio os argumentos que esse método espera - static void sifter(A[]… a2)???
Valew.