Questão estranha de Autobox

Alguem poderia me falar a resposta e a explicação desse codigo?

public class Locura {
	
	public Locura(Long a, Long b)
	{
		System.out.println("Long a, Long b");
	}
	
	public Locura(long a, long b)
	{
		System.out.println("long a, long b");
	}
			
	public static void main(String[] args) {
		Long a = 10L;
		new Locura(a, 15L);
	}
}

Autoboxing+sobrecarga é sempre um problema.

A minha aposta é que o compilador emite um erro porque a chamada é ambígua, mas não tenho certeza (e no momento não tenho como testar). Para tirar a dúvida, tente compilar isso e vê o que acontece.

Bom pelo que imagino o compilador fica confuso, se faz unbox ou autobox, dando erro de compilação, tirando qualquer um dos construtores funcionara.

eu tbm acho… essa é complicada!

O problema acontece pq vc está colocando parâmetros diferentes para chamar o mesmo método. O 1º parâmetro é um Wrapper Long e o 2º é um primitivo long, aí está o problema. Não tem nenhum construtor que receba como argumento um Wrapper Long e um primitivo long. Ou vc sobrecarrega outro construtor que tenha como argumento um Wrapper Long e um primitivo long ou na hora de chamar o construtor passe como está definido nos construtores…blz!!!

vlw

O compilador disse:

Erro de compilação na linha 15. Se vc mudar a variável Long na linha 14 para long o código compilará e imprimirá long a, long b.

essa foi chata em :slight_smile: mas da erro de compilação mesmo !

mas o que vocês acham desse código aqui olha

[code] public class TesteGuj{

public static void go(int[] a){
System.out.println(“Estou em array”);

}

public static void go(int… a){

System.out.println(“estou em vararg”);
}

public static void main(String… a){

go(1,2,3);//qual o resultado ???

}
}[/code]

Essa é fácil. Dá erro de compilação porque … e [] são equivalentes (that’s just synthatic sugar), daí teria dois métodos com a mesma assinatura.

[Edit: hmm pensando bem, acho que estou enganado. Acho que ele chamaria o varargs.]

exatamente :slight_smile:

[quote=thingol]O compilador disse:

[quote=javac]
Locura.java:15: reference to Locura is ambiguous, both method Locura(java.lang.Long,java.lang.Long) in Locura and method Locura(long,long) in Locura match
new Locura(a, 15L);
^
1 error
[/quote][/quote]

hehe, foi dai mesmo que tirei minhas conclusões;

essa tbm é boa;

public class Teste {
	public Teste(Object obj) {
		System.out.println("Object");
    }
    public Teste(String obj) {
    	System.out.println("String");
    }
    public Teste(Integer obj) {
    	System.out.println("Integer");
    }
    public static void main(String[] args) {
    	new Teste(null);
    }
}

e essa:

public class Teste {
    public Teste(Object obj) {
    System.out.println("Object");
    }
    public Teste(A obj) {
    System.out.println("A");
    }
    public Teste(B obj) {
    System.out.println("B");
    }
    public static void main(String[] args) {
    new Teste(null);
    }
    class A {
    }
    class B extends A {
    }
}

O primeiro não compila é ambigu :slight_smile:

e a segunda pega o tipo mais generico possivel ou seja imprimi B

Galera quero vem quem mata essa aki sem compilar. Pegando a carona no código do nosso amigo. Eu digo a resposta mas vamos ver o que todos dizem.

public class Teste2{ public Teste2(Object obj) { System.out.println("Object"); } public Teste2(A obj) { System.out.println("A"); } public Teste2(B obj) { System.out.println("B"); } public Teste2(C obj) { System.out.println("C"); } public Teste2(A2 obj) { System.out.println("A2"); } public static void main(String[] args) { new Teste2(10); C c1 = null; c1.Teste2(new A2(){public void Teste2(A a) {}}) } class A { } class B extends A { } public class C implements A2{ public void Teste2(A2 a){} public void Teste2(A a) {} } interface A2{void Teste2(A a);} }

Respostas:
a)Imprime A2
b)Imprime C
c)Lança uma exceção em tempo de execução
d)Contêm um erro em um ponto do código
e)Contêm varios erros
f)Imprime B
g)Imprime A

c) Lança uma exceção em tempo de execução, na linha 20.

Alguêm mais?

[quote=anderson.bonavides]Galera quero vem quem mata essa aki sem compilar. Pegando a carona no código do nosso amigo. Eu digo a resposta mas vamos ver o que todos dizem.

public class Teste2{ public Teste2(Object obj) { System.out.println("Object"); } public Teste2(A obj) { System.out.println("A"); } public Teste2(B obj) { System.out.println("B"); } public Teste2(C obj) { System.out.println("C"); } public Teste2(A2 obj) { System.out.println("A2"); } public static void main(String[] args) { new Teste2(10); C c1 = null; c1.Teste2(new A2(){public void Teste2(A a) {}}) } class A { } class B extends A { } public class C implements A2{ public void Teste2(A2 a){} public void Teste2(A a) {} } interface A2{void Teste2(A a);} }

Respostas:
a)Imprime A2
b)Imprime C
c)Lança uma exceção em tempo de execução
d)Contêm um erro em um ponto do código
e)Contêm varios erros
f)Imprime B
g)Imprime A[/quote]

Chegou perto vanzella. Olha só ocorre um erro de compilação. Se vc prestar atenção na linha da chamada do método vai verificar que estã faltando um ponto e virgula no final da classe de método.
Olha só a identação:

c1.Teste2(new A2(){ public void Teste2(A a) { } }); //faltava o ponto e virgula.

Caso corrigisse esse problema ai sim o código lançava uma exceção como vc destacou.
Fiz isso pra testar pra ver se a turma tava compilando o código antes de postar a saída. Mas nem deu tempo.

:wink:

boa essa pegadinha anderson :-o

putz, é mesmo, não percebi, nem analisei mais o código depois que vi uma chamada de um objeto nulo.