Para que é instanceof
utilizado o operador? Eu já vi coisas como
if (source instanceof Button) {
//...
} else {
//...
}
Mas nada disso fazia sentido para mim. Eu fiz minha pesquisa, mas criei apenas exemplos sem explicações.
java
instanceof
Ben
fonte
fonte
instanceof
substituirequals
?Respostas:
instanceof
A palavra-chave é um operador binário usado para testar se um objeto (instância) é um subtipo de um determinado tipo.Imagine:
Imagine um
dog
objeto criado comObject dog = new Dog()
, então:No entanto, com
Object animal = new Animal();
,porque
Animal
é um supertipoDog
e possivelmente menos "refinado".E,
Isso ocorre porque
Dog
não é um subtipo nem um supertipo deCat
, e também não o implementa.Observe que a variável usada
dog
acima é do tipoObject
. Isso é para mostrar queinstanceof
é uma operação de tempo de execução e nos leva a um / ao caso de uso: reagir de maneira diferente com base no tipo de objeto no tempo de execução .O que deve ser observado:
expressionThatIsNull instanceof T
é falso para todos os tiposT
.Feliz codificação.
fonte
Object dog = new Dog(); System.out.println(dog instanceof Cat);
. Isso compila muito bem e imprimefalse
. O compilador não é permitido para determinar em tempo de compilação quedog
não pode ser um gato (conforme as regras nas JLS)boolean b = "foo" instanceof Integer;
Object indirect = ...; if (indirect instanceof Something)
. Não éif (literal instanceof Something)
como você parece estar assumindo.Object dog
parte. Foi mal!dog instanceof Cat // does not even compile!
(porque é uma classe). SeCat
fosse uma interface, ela seria compilada.É um operador que retorna true se o lado esquerdo da expressão for uma instância do nome da classe no lado direito.
Pense nisso desta maneira. Digamos que todas as casas do seu quarteirão foram construídas com os mesmos projetos. Dez casas (objetos), um conjunto de plantas (definição de classe).
instanceof
é uma ferramenta útil quando você tem uma coleção de objetos e não tem certeza do que eles são. Digamos que você tenha uma coleção de controles em um formulário. Você deseja ler o estado marcado de qualquer caixa de seleção existente, mas não pode solicitar a um objeto antigo simples o estado marcado. Em vez disso, você veria se cada objeto é uma caixa de seleção e, se for, lança-o em uma caixa de seleção e marque suas propriedades.fonte
instanceof
pode torná-lo seguro para fazer o downcast.Conforme descrito neste site :
Eu espero que isso ajude!
fonte
Este operador permite determinar o tipo de um objeto. Retorna um
boolean
valor.Por exemplo
a saída é:
fonte
Se
source
é umaobject
variável,instanceof
é uma maneira de verificar se éButton
ou não.fonte
Conforme mencionado em outras respostas, o uso típico canônico
instanceof
é para verificar se um identificador está se referindo a um tipo mais específico. Exemplo:Observe, no entanto, que o tipo da expressão à esquerda deve ser um tipo pai da expressão à direita (consulte JLS 15.20.2 e Java Puzzlers, # 50, pp114 ). Por exemplo, o seguinte falhará ao compilar:
Isso falha ao compilar com a mensagem:
Como
Test
não é uma classe pai deString
. OTOH, isso compila perfeitamente e imprimefalse
conforme o esperado:fonte
fonte
Pode ser usado como um atalho na verificação de igualdade.
fonte
A maioria das pessoas explicou corretamente o "O quê" desta pergunta, mas ninguém explicou o "Como" corretamente.
Então, aqui está uma ilustração simples:
Saídas:
O motivo do erro do compilador ao comparar
s
com o StringBuffer é bem explicado nos documentos :que implica o LHS deve ser uma instância do RHS ou de uma classe que implemente o RHS ou estenda o RHS.
Como usar use instanceof então?
Como toda classe estende um objeto, o LHS de conversão de tipo para objeto sempre funcionará a seu favor:
Saídas:
fonte
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //shouldn't this be true
, já que estamos digitando s para Objeto?http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
fonte
A instância da palavra-chave é útil quando você deseja conhecer a instância de um objeto específico.
Suponha que você esteja lançando uma exceção e quando tiver capturado, execute a operação personalizada de soma e continue novamente conforme sua lógica (lances ou log etc.)
Exemplo: 1) O usuário criou a exceção personalizada "InvalidExtensionsException" e a lança conforme a lógica
2) Agora, no bloco catch catch (Exceção e) {execute a lógica da soma se o tipo de exceção for "InvalidExtensionsException"
3) Se você não estiver verificando a instância e o tipo de exceção for Exceção de ponteiro nulo, seu código será interrompido.
Portanto, sua lógica deve estar dentro da instância de if (instância de InvalidExtensionsException) {InvalidExtensionsException InvalidException = (InvalidExtensionsException) e; }
O exemplo acima é uma prática incorreta de codificação. No entanto, este exemplo ajuda a entender o uso da instância dele.
fonte
A melhor explicação é jls . Sempre tente verificar o que a fonte diz. Lá você obterá a melhor resposta e muito mais. Reproduzindo algumas partes aqui:
fonte
O
instanceof
operador java é usado para testar se o objeto é uma instância do tipo especificado (classe ou subclasse ou interface).A instanceof em java também é conhecida como tipo
comparison operator
, pois compara a instância com o tipo. Retornatrue
oufalse
. Se aplicarmos oinstanceof
operador com qualquer variável que tenhanull
valor, ela retornaráfalse
.Do JDK 14+, que inclui o JEP 305 , também podemos fazer "Correspondência de Padrões" para
instanceof
Os padrões testam basicamente que um valor tem um determinado tipo e podem extrair informações do valor quando ele possui o tipo correspondente. A correspondência de padrões permite uma expressão mais clara e eficiente da lógica comum em um sistema, ou seja, a remoção condicional de componentes dos objetos.
Antes do Java 14
Aprimoramentos do Java 14
Também podemos combinar a verificação de tipo e outras condições
O uso da correspondência de padrões em
instanceof
deve reduzir o número geral de transmissões explícitas nos programas Java.PS :
instanceOf
corresponderá apenas quando o objeto não for nulo, e somente poderá ser atribuído a elestr
.fonte
fonte
Exemplo de código muito simples:
Tenha cuidado aqui. No exemplo acima, se Class1 for Object, a primeira comparação será sempre verdadeira. Portanto, assim como as exceções, a ordem hierárquica é importante!
fonte
Você pode usar o Map para obter uma abstração mais alta na instância de
Em seguida, fazer com que esse mapa adicione alguma ação a ele:
Depois de ter um objeto de tipo desconhecido, você pode obter ações específicas desse mapa:
fonte
O operador instanceof é usado para verificar se o objeto é uma instância do tipo especificado. (classe ou subclasse ou interface).
A instanceof também é conhecida como operador de comparação de tipos, porque compara a instância com o tipo. Retorna verdadeiro ou falso.
Se aplicarmos o operador instanceof com qualquer variável que tenha valor nulo, ele retornará false.
fonte