Programação
 › Algoritmo  › C/C++  › Java
Web
 › HTML/XHTML  › JavaScript  › PHP
Sistema Operacional
 › Comandos de DOS  › Windows  › Linux  › Mac/BSD
Office
 › Word / Writer  › Excel / Calc
Áreas do Site
 › Download  › Fórum  › Blog
Recomendamos
Computadores e Informática em Lisboa
TI Expert » Programação » Java » Typecast e Instanceof - Indução de Tipos

Typecast

Indução de tipo

Quando lidamos com linguagens de programação fortemente tipadas como Java, nos confrontamos muitas vezes com a necessidade de variar de um tipo de dado para outro.

Há casos, também, em que até mesmo o compilador não compreende que tipo de dado estamos atribuindo a uma variável.

Em Java, nós podemos fazer uso do que chamamos de indução de tipo ou typecast.

O typecast dita ao compilador como tal dado deve ser interpretado e manipulado.

Essa indução de tipo ou typecast pode ser implícita ou explícita.

O typecast implícito é feito automaticamente pelo compilador quando um tipo de dado pode ser facilmente manipulado no lugar de outro tipo de dado. O typecast explícito é feito diretamente no algorítmo para indicar ao compilador qual a forma de interpretação de um dado quando ele entende que há ambiguidade ou formatos incompatíveis.

O typecast explícito é dado sempre dentro de parênteses que sempre vem antes do dado a ser induzido. Ex.: (int) var1, (float) var2, (Object) var3, ...

Typecast de Dados Primitivos

O typecast de dados primitivos é dado basicamente em questão de seu consumo de memória. Se tentamos designar um tipo de dado que consome menos memória para um que consome mais memória, o typecast é realizado implicitamente. No exemplo abaixo, atribuimos um dado inteiro (varInt) a uma variável do tipo float (varFloat).

public class ExemploTypecast1 {
    public static void main(String[] args) {
        float varFloat;
        int varInt;
        varInt = 200;
        varFloat = varInt;
        System.out.println(varFloat);
    }
}

O contrário não se aplica. Tentar atribuir um tipo de dado maior para um tipo de dado menor irá resultar em um erro de tipos incompatíveis (type mismatch).

Para demonstrar isso, usaremos dois tipos de dados inteiros. Porém, iremos atribuir um inteiro longo (que consome mais memória) a um dado inteiro que consome menos. Nesse caso, somos obrigados a usar typecast explícito.

public class ExemploTypecast2 {
    public static void main(String[] args) {
        long varLong;
        int varInt;
        varLong = 200;
        varInt = (int) varLong;
        System.out.println(varInt);
    }
}

Typecast de Classes e Objetos

Typecast também pode ser usado em Classes e Objetos.

Sempre e uma classe for genérica, ela poderá receber qualquer tipo de objeto que será feito o typecast implicitamente.

Por exemplo, vamos utilizar a classe TV que vinhamos criando até agora.

package tiexpert;

public class TV {
    int tamanho;
    int canal;
    int volume;
    boolean ligada;

    public TV(int tamanho, int canal, int volume, boolean ligada) {
        this.tamanho = tamanho;
        this.canal = canal;
        this.volume = volume;
        this.ligada = ligada;
    }
}

Agora, vamos instanciar uma variável da classe genérica Object com a classe TV.

package tiexpert;

public class ExemploTypecast3 {
    public static void main(String[] args) {
        Object obj = new TV(29, 1, 0, false);
        System.out.println("A variável obj é "
                            + obj.getClass());
    }
}

Como podemos perceber, o resultado de getClass da variável obj não é sua classe original (Object), mas sua instância: class tiexpert.TV.

Agora, não será possível criar uma cópia desse objeto para uma variável do mesmo tipo de sua instância. Neste caso, devemos fazer o typecast explícito da classe.

package tiexpert;

public class ExemploTypecast4 {
    public static void main(String[] args) {
        Object obj = new TV(29, 1, 0, false);
        TV tv = (TV) obj;
        TV tv2 = new TV(29, 1, 0, false);
        System.out.println("A variável tv é cópia de obj" +
                              "\nobj: " + obj.toString() +
                              "\ntv: " + tv.toString());
        System.out.println("TV2 é outro objeto: " + tv2.toString());
    }
}

O resultado do código acima seria algo como:

A variável tv é cópia de obj
obj: tiexpert.TV@12345f
tv: tiexpert.TV@12345f
TV2 é outro objeto: tiexpert.TV@abcde1

Instanceof

No exemplo anterior, se tentássemos atribuir obj diretamente a tv ocorreria um erro de tipos incompatíveis (type mismatch).

Quando lidamos com classes, podemos testar qual seu tipo de instancia usando o operador instanceof.

Instanceof indica se um objeto (já instanciado) pertence a uma classe.

O uso de instanceof é: objeto instanceof nomeDaClasse.

Para melhorar o exemplo anterior, usaremos instanceof antes de atribuirmos obj a tv.

package tiexpert;

public class ExemploTypecast {
    public static void main(String[] args) {
        Object obj = new TV(29, 1, 0, false);
        TV tv = null;
        if (obj instanceof TV) {
             tv = (TV) obj;
        }
        TV tv2 = new TV(29, 1, 0, false);
        System.out.println("A variável tv é cópia de obj" +
                              "\nobj: " + obj.toString() +
                              "\ntv: " + tv.toString());
        System.out.println("TV2 é outro objeto: " + tv2.toString());
    }
}
Faça o Download deste Código

Creative Commons License
Autor: Denys William Xavier
Este artigo está sob Licença Creative Commons.
Fonte: The Java™ Tutorials.

Faça o download da versão em PDF Indique nosso site Gostou?
Indique nosso site!
Este artigo foi
lido 57624 vezes
Bookmark e Compartilhe

Páginas Relacionadas

Enquete
O Google Chrome OS irá desbancar o Microsoft Windows 7?
» ProgramaçãoAlgorítmo | C/C++ | Java

» WebHTML/XHTML | JavaScript | PHP

» Sistema OperacionalComandos de DOS | Windows | Linux | Mac/BSD

» OfficeWord/Wirter | Excel/Calc

» Áreas do SiteDownloads | Fórum | Blog