Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida no Ex. 6 da Aula 3 - Começando com Orientação a objetos

Ao invés de utilizar varáveis do tipo int no método mostraData, utilizei variáveis do tipo short e o código não compila, apresentando a seguinte mensagem de erro:

"The method preencheData(short, short, short) in the type Data is not applicable for the arguments (int, int, int)"

Se não utilizei ints em parte alguma da classe Data, por que recebo esta mensagem, levando em consideração que os valores fornecidos para os atributos estão entre dentro do range de um short (-32.768 a 32.767)? PS: convertendo todos os shorts para int, o código compila sem problema algum.

Segue trecho do código:

    //--Classe Data

    public class Data {

    short dia;
    short mes;
    short ano;


    void preencheData (short dia, short mes, short ano) {
            this.dia = dia;
            this.mes = mes;
            this.ano = ano;
        }

//----

    //--Classe Funcionario

    public class Funcionario {

    Data dataAdmissao = new Data();
    String departamento;
    int matricula;
    String nome;
    String rg;
    double salario;
    }
//----

    //--Método main que executa o código

    public class Ex06 {
    public static void main(String[] args) {

        Funcionario joao = new Funcionario();
        joao.dataAdmissao.preencheData(2, 5, 2011);
        joao.departamento = "RH";
        joao.matricula = 6812;
        joao.nome = "Joao da Silva";
        joao.rg = "98.765.432-1";
        joao.salario = 2800.0;
        }
    }
4 respostas

André,

a passagem de parâmetro por mais que você esteja recebendo como short, está sendo feito por int, o compilador não entendeu que os valores 2,5 e 2011 são shorts. Está sendo lido como int.

Você poderia fazer um cast (que imagino que tenha essa explicação mais pra frente), ou passar uma variável do tipo short explicitamente, algo como o exemplo abaixo:

//Por cast

joao.dataAdmissao.preencheData((short)2, (short)5, (short)2011);

//Variáveis explícitas

        short dia = 2;
        short mes = 5;
        short ano = 2011;
        //código omitido
        joao.dataAdmissao.preencheData(ano, mes, dia);

Passar por cast é algo como dizer para o compilador que você tem certeza que o que você está passando é aquilo mesmo. Nesse caso, tenho certeza que quero passar um short, não um int.

Não há um grande ganho em usar short ao invés de int, a JVM é bem esperta pra saber onde pode vazar memória e essa é a menor das preocupações.

Obrigado pela ajuda João! Porém a questão que ainda não me ficou muito clara é: se declarei variáveis tipo short no meu método e usei valores dentro do range de um short, por que a JVM os interpreta como int? Na minha cabeça faria sentido usar o casting caso eu desejasse converter os valores de int para short, mas como eles foram declarados como short, não deveriam simplesmente funcionar normalmente caso o valor informado caiba num short?

solução!

André,

para a JVM a passagem de parâmetros está sendo como int. Fazer joao.dataAdmissao.preencheData(2, 5,2011); seria interpretado como "Opa, esse 2 é int, o 5 é int e o 2011 é int mas o método recebe um short então tá errado". Pq inplícitamente os números são ints para a JVM então tem que dizer exatamente qual o tipo.

Eu usaria o recebimento como int mesmo. Não vejo grande ganho em usar short mesmo sabendo que os valores estão na variação de um short.

Aaah, saquei! Era isso que não estava claro para mim, não sabia que a JVM vê os números como int por default, tornando o casting necessário. Obrigado mais uma vez (: