Skip to content

1.4 Use the instanceof operator and casting

Weverton edited this page Aug 29, 2016 · 3 revisions

Exemplo:

interface I{}
class A implements I{}
class B extends A {}
class C extends B{}

A a = new A();
B b = new B(); 

b é um A então o cast é permitido;
b não implementa I, mas ele herda de A que implementa I

a = (B)(I)b; //VAI COMPILAR E EXECUTAR COM SUCESSO

a implementa I, então cast correto;
O cast explicito para B é valido, entretando esse a não esta apontando para um objeto do tipo b sendo assim vai dar erro em tempo de execução.

b = (B)(I) a //VAI COMPILAR MAS VAI DAR ERRO EM TEMPO DE EXECUCAO

No exemplo abaixo tudo vai retornar true:

class A {}
class B extends A {}
class C extends B {}
class D extends C {}

public class Teste5 {

	public static void main(String[] args) {
		D d = new D();

		System.out.println("d instanceof A? " + (d instanceof A));
		System.out.println("d instanceof B? " + (d instanceof B));
		System.out.println("d instanceof C? " + (d instanceof C));
		System.out.println("d instanceof D? " + (d instanceof D));	
	}
}

Abaixo o código compila corretamente, s2 pode ser atribuido para s1 com cast ou sem cast.

class Super {  }
class Sub extends Super {  }

public class TestClass {
   
      public static void main(String[] args) {
           Super s1 = new Super(); //1
           Sub s2 = new Sub();     //2
           s1 = (Super) s2;        //3
      }
 
}
Clone this wiki locally