Se classe B
e classe C
estendem classe A
e eu tenho um objeto do tipo B
ou C
, como posso determinar de que tipo é uma instância?
java
inheritance
transportadora
fonte
fonte
Respostas:
fonte
if(!(obj instanceof C))
code
Child1 child1 = new Child1 (); Parent1 parentChild = new Child2 (); Filho2 filho2 = novo Filho2 (); (instância child1 do Parent1); (instância child1 de Child1); (instância parentChild de Child2); (parentChild instanceof Parent1); (instância parentChild de Child1);code
, pode limpar a intenção de instanceof.Use Object.getClass () . Retorna o tipo de tempo de execução do objeto.
fonte
Várias respostas corretas foram apresentadas, mas ainda existem mais métodos:
Class.isAssignableFrom()
e simplesmente tentar lançar o objeto (que pode lançar aClassCastException
).Formas possíveis resumidas
Vamos resumir as maneiras possíveis de testar se um objeto
obj
é uma instância do tipoC
:Diferenças no
null
manuseioHá uma diferença no
null
manuseio:false
seobj
énull
(null
não é instância de nada).NullPointerException
obviamente.null
porquenull
podem ser convertidos para qualquer tipo!Notas
Class.getName()
não deve ser usado para executar um teste "is-instance-of" porque, se o objeto não for do tipo,C
mas uma subclasse dele, ele pode ter um nome e pacote completamente diferentes (portanto, os nomes das classes obviamente não coincidem), mas é ainda do tipoC
.Class.isAssignableFrom()
não é simétrico :obj.getClass().isAssignableFrom(C.class)
retornariafalse
se o tipo deobj
fosse uma subclasse deC
.fonte
Você pode usar:
HTH. Mas acho que na maioria das vezes não é uma boa prática usar isso para controlar o fluxo ou algo semelhante ...
fonte
Qualquer uso de qualquer um dos métodos sugeridos é considerado um cheiro de código, baseado em um projeto de OO ruim.
Se o seu design for bom, você não precisará usar
getClass()
ouinstanceof
.Qualquer um dos métodos sugeridos servirá, mas apenas algo a ter em mente, em termos de design.
fonte
Podemos usar a reflexão neste caso
Exemplo:-
Nesse caso, você obterá o nome da classe que o objeto passa para a
HttpServletRequest
variável de referência de interface.fonte
obj.getClass()
retornará o className, prefixex pela palavraclass
request.getClass().getName();
imprime todo o pacote! juntamente com o nome da classeTambém existe um
.isInstance
método naClass
classe " ". se você obtiver a classe de um objeto via,myBanana.getClass()
poderá ver se o objetomyApple
é uma instância da mesma classe quemyBanana
viafonte
verificar com
isinstance()
não seria suficiente se você quiser saber em tempo de execução. usar:fonte
Eu uso a função blow na minha classe GeneralUtils, verifique se pode ser útil
fonte
Usei os genéricos do Java 8 para obter qual é a instância do objeto em tempo de execução, em vez de precisar usar o caso do comutador
transmita qualquer tipo de dado e o método imprimirá o tipo de dado que você passou enquanto o chamava. por exemplo
A seguir está a saída
fonte