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?
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?
Respostas:
if (obj instanceof C) {
//your code
}
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.
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 a ClassCastException
).
Vamos resumir as maneiras possíveis de testar se um objeto obj
é uma instância do tipo C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
manuseioHá uma diferença no null
manuseio:
false
se obj
é null
( null
não é instância de nada).NullPointerException
obviamente.null
porque null
podem ser convertidos para qualquer tipo!Lembrar:
null
não é uma instância de nenhum tipo, mas pode ser convertida para qualquer tipo.
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 tipo C
.Class.isAssignableFrom()
não é simétrico : obj.getClass().isAssignableFrom(C.class)
retornaria false
se o tipo de obj
fosse uma subclasse de C
.Você pode usar:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Mas acho que na maioria das vezes não é uma boa prática usar isso para controlar o fluxo ou algo semelhante ...
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()
ou instanceof
.
Qualquer um dos métodos sugeridos servirá, mas apenas algo a ter em mente, em termos de design.
Podemos usar a reflexão neste caso
objectName.getClass().getName();
Exemplo:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
Nesse caso, você obterá o nome da classe que o objeto passa para a HttpServletRequest
variável de referência de interface.
obj.getClass()
retornará o className, prefixex pela palavraclass
request.getClass().getName();
imprime todo o pacote! juntamente com o nome da classe
Também existe um .isInstance
método na Class
classe " ". se você obtiver a classe de um objeto via, myBanana.getClass()
poderá ver se o objeto myApple
é uma instância da mesma classe que myBanana
via
myBanana.getClass().isInstance(myApple)
verificar com isinstance()
não seria suficiente se você quiser saber em tempo de execução. usar:
if(someObject.getClass().equals(C.class){
// do something
}
Eu uso a função blow na minha classe GeneralUtils, verifique se pode ser útil
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
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
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
transmita qualquer tipo de dado e o método imprimirá o tipo de dado que você passou enquanto o chamava. por exemplo
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
A seguir está a saída
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []