Duvida-conversão Cast implícito e explicitas

4 respostas
G

Ola pessoal,

Estou fazendo um código do livro de certificação e não consigo compreender o motivo do erro!
Esta reclamando porque estou passando o valor 7 para um método que recebe como argumento um short, só que 7 não cabe em um short?

o código:

class Alien{
	String invade (short ships){
		return " a few";
	}
	
	String invade(short... ships){
		return "many";
	}
}

class Defender{

	public static void main(String[] args){
	
		System.out.println(new Alien().invade(7));
	}
}

4 Respostas

N

7 cabe num short, desde que o 7 esteja em uma variável short. Acontece que todo valor númerico literal é tratado como int, então int não cabe num short, logo é necessário fazer a conversão explicita.

L

Funcionaria se fosse:

System.out.println(new Alien().invade((short)7));

Como foi dito, não funciona se você passa um int para um método que recebe um short.

Mas lembre-se, que o código abaixo funciona:

short teste = 7;

É chatinho esta parte mesmo…

G

primeiramente agradeço pela atenção de todos.

Então lsouza13 quer dizer quanto passar um valor para um método ela não faz a conversão implícita?
Como você mostrou se for passar o valor 7 para uma variável short ele faz a conversão agora para método não.

L

Grohl:
primeiramente agradeço pela atenção de todos.

Então lsouza13 quer dizer quanto passar um valor para um método ela não faz a conversão implícita?
Como você mostrou se for passar o valor 7 para uma variável short ele faz a conversão agora para método não.

Sim, uma coisa que usei pra entender/memorizar isso quando fui fazer OCJP é o seguinte…
O código abaixo funciona. Mesmo vc passando o int, este 32767 é o último valor (positivo) que “cabe” num short.

Então, quando vc coloca o:

o compilador vai acusar erro. Ou seja, a conversão da atribuição é VERIFICADA pelo compilador (tempo de compilação).

Só que quando vc tem um método, o compilador não pode, em tempo de compilação avaliar se o que vc ta passando caberia numa variável short. Ou melhor, ele não foi feito pra avaliar isso. É detalhe de implementação da JVM mesmo.

Então, se vc tiver

e tiver a chamada pra esse método, tudo só será resolvido em tempo de execução.

Assim o que o compilador pode te garantir é, nunca passe um literal pra esse método do tipo int, porque não posso VERIFICAR o valor dele antes da execução. E vc poderia acabar me passando um int que não cabe no parâmetro do tipo short.

Uma outra forma de memorizar, é analisando do ponto de vista dos métodos, nas regras:

  1. ampliação
  2. auto(un)boxing
  3. var-args
    (para saber mais veja pag 143 do livro da Kathy, versão em português).
    Passando um int não se encaixaria em nenhuma regra a “volta” para short.

Se persistir dúvidas, vamos debatendo…
abs

Criado 17 de março de 2013
Ultima resposta 17 de mar. de 2013
Respostas 4
Participantes 3