[Duvida] Instanceof

3 respostas
I

Povo,dei uma pesquisada nos fóruns sobre isso,mas ainda não peguei a idéia.É tipo um == pra classes e objetos?

Qual é a real utilidade disso?Tipo…se eu tiver,por qq motivo,que passar um objeto como argumento de função…pq usar o instanceof,se,quando eu escrever o codigo,ao passar um objeto errado na chamada de função,o compilador já vai acusar o erro devido à diferença de tipos entre o argumento da chamada e o do protótipo?

Tá meio enrolado de explicar…Mas o livro Java in a Nutshell também nao diz muito.Só tem um exemplo com um if,mas aqui vi uns códigos com return (B instanceof A)…

3 Respostas

B

Ola,

Bom, o instanceof serve para verificar em tempo de execução se um objeto faz parte da hierarquia de uma determinada classe... vou tentar te dar um exemplo prático sobe isto.

Suponha que, usando Java 4, vc tenha um List de objetos, mas vc não sabe o que pode estar dentro deste list, então para fazer uma determinado procedimento vc pega cada item deste list e verifica se é do objeto que vc sabe tratar.. por exemplo:

List list = new ArrayList();
preencheList(list); // aqui vamos supor que vc preenche o list com alguns objetos...

tratalist(list); //aqui vc vai tratar o list
...

public void trataList(List list){
  for(int i=0;i<list.size();i++){
    Object ob = list.get(i);
    if(ob instanceof String){
      trataString((String)ob);
    }
    ...
}

Neste caso eu verifiquei se o objeto era uma instancia de String, para quando for fazer o Cast não dar erro...

Ele básicamente serve para isto.

J
pq usar o instanceof,se,quando eu escrever o codigo,ao passar um objeto errado na chamada de função,o compilador já vai acusar o erro devido à diferença de tipos entre o argumento da chamada e o do protótipo?
Sim, mas veja esse exemplo:
public class Animal{

}

public class Gato extends Animal implements Serializable{

}

public class Cao extends Animal{

}


public class Teste{
   public static void main(String[] args){
      metodo1(new Gato());
      metodo1(new Cao());
      isSerializable(new Gato());
      isSerializable(new Cao());
   }
   public static void metodo1(Animal an){
      if(an instaceof Gato){
         System.out.println("É um gato...");
      }

      if(an instanceof Cao){
         System.out.println("É um cão...");
      }
   }

   public void isSerializable(Object obj){
      if(obj instaceof Serializable){
          System.out.println("É serializavel...");
      }else{
          System.out.println("Não é serializavel...");
      }
}

Um uso comum pra isso é não implementação do método equals(), veja:

public class Pessoa{
   private String cpf;
   //get & set
   public boolean equals(Object obj){
      if(obj instanceof Pessoa){
         Pessoa pes = (Pessoa) obj;
         return getCpf().equals(pes.getCpf());
      }

      return false;
   }
}
S

O operador instanceof serve para verificar se determinado objeto é uma instancia de um determinado tipo (classe ou interface).
É usado quando o argumento apresenta polimorfismo e é necessário destingir entre as várias hipoteses.
Deve ser usado, por exemplo, na implementação de equals(Object) para certificar que o objeto passado é da mesma classe do objeto em teste.

public class AClasse {
public boolean equals(Object obj){
        return obj instanceof AClasse && .. // adiciona logica de igualdade
}
}

Não deve ser usado para implementar lógicas diferente conforme o tipo de classe. Para isso, apenas polimorfismo deve ser usado[/code]

Criado 11 de dezembro de 2006
Ultima resposta 11 de dez. de 2006
Respostas 3
Participantes 4