Ajuda para entender uma questão

Pessoal podem me ajudar na questão abaixo ?
Tinha entendido que, tudo o que roda no Java 5 tem que roda nas versões mais antigas do Java.
Com esse pensamento foi resolver a questão abaixo:

public class testeQuestao {
	
	public static void go(Short s){
		System.out.println("Utilizou SHORT ");
	}
	public static void go(Long l){
		System.out.println("Utilizou LONG ");
	}
	public static void go(int i){
		System.out.println("Utilizou int");
	}

	public static void main(String args[]){	
		short x = 7;
		long y  = 6;
	 	go(x);
	 	go(y);
		}

}

As opções:

a) O codigo não compila.
b) O codigo roda mas gera uma exceção em tempo de execução.
c) Utilizou SHORT Utilizou LONG
d) Utilizou int Utilizou LONG

Tipo com o pensamento que eu tinha logo de cara procurei pela resposta :
Utilizou int Utilizou int
e não tem !!!

Aew resolvi testar, se mudo o parametro do metodo go para:
go(7);
go(6);
Gera a saída: Utilizou int Utilizou int

Alguem pode me explicar o porque que quando passo
go(x);
go(y);
Não gera a saida Utilizou int Utilizou int pois a resposta correta é Utilizou int Utilizou LONG

Desde já agradeço !

[quote=SemChance]Pessoal podem me ajudar na questão abaixo ?
Tinha entendido que, tudo o que roda no Java 5 tem que roda nas versões mais antigas do Java.
Com esse pensamento foi resolver a questão abaixo:

public class testeQuestao {
	
	public static void go(Short s){
		System.out.println("Utilizou SHORT ");
	}
	public static void go(Long l){
		System.out.println("Utilizou LONG ");
	}
	public static void go(int i){
		System.out.println("Utilizou int");
	}

	public static void main(String args[]){	
		short x = 7;
		long y  = 6;
	 	go(x);
	 	go(y);
		}

}

As opções:

a) O codigo não compila.
b) O codigo roda mas gera uma exceção em tempo de execução.
c) Utilizou SHORT Utilizou LONG
d) Utilizou int Utilizou LONG

Tipo com o pensamento que eu tinha logo de cara procurei pela resposta :
Utilizou int Utilizou int
e não tem !!!

Aew resolvi testar, se mudo o parametro do metodo go para:
go(7);
go(6);
Gera a saída: Utilizou int Utilizou int

Alguem pode me explicar o porque que quando passo
go(x);
go(y);
Não gera a saida Utilizou int Utilizou int pois a resposta correta é Utilizou int Utilizou LONG

Desde já agradeço !

[/quote]

Bom tem uma pergunta dessas na pagina anterior vc podia dar uma olhada q la tema resposta mas…vamos lá.

vc tem que olhar NESTE CASO o que a JVM vai utilizar de meios mais faceis sendo assim: “ampliação” se nao tiver como fazer ela procura por “objetos wrappers (autoboxing)” e depois procura por varargs…

Sendo assim nesse caso quando vc passa um short para o método go() ele vai fazer uma ampliaçao para int, ao invez de fazer autoboxing para Short, e quando vc passa um long para o metodo go() ele vai fazer autoboxing para Long.

Entaum, para o JVM é mais facil fazer o AutoBoxing para Long e pq não é mais facil fazer o autoBoxing para o Short tb ?.

Se rodasse esse codigo em versões anteriores do Java 5 a resposta seria Utilizou int Utilizou int ?

Obrigado pelas respostas.

[quote=SemChance]Entaum, para o JVM é mais facil fazer o AutoBoxing para Long e pq não é mais facil fazer o autoBoxing para o Short tb ?.

Se rodasse esse codigo em versões anteriores do Java 5 a resposta seria Utilizou int Utilizou int ?

Obrigado pelas respostas.

[/quote]

ela nao fez autoBoxing para Short porque tem um “int” como parametro, então um short “cabe” em um int por isso nao faz o autoBoxing.

Opa entendi … !
E ele faz o AutoBoxing para o Long, pois o long passado no metodo go() não cabe dentro do int.
Obrigado.

[quote=SemChance]Opa entendi … !
E ele faz o AutoBoxing para o Long, pois o long passado no metodo go() não cabe dentro do int.
Obrigado.
[/quote]

isso ai!!

Se assim fosse nunca haveria evolução.

Tem que seguir a ordem:

Widening > Boxing > Var args