Comparar os tipos de classes em Java
quero comparar o tipo de classe em Java.
Pensei que conseguia fazer isto.class MyObject_1 {}
class MyObject_2 extends MyObject_1 {}
public boolean function(MyObject_1 obj) {
if(obj.getClass() == MyObject_2.class) System.out.println("true");
}
eu queria comparar no caso de o obj passar para a função ser estendido A partir de MyObject_1 ou não. Mas isto não funciona. Parece o método getClass() e o .a classe dá diferentes tipos de informação.
Como posso comparar dois tipos de classe, sem ter de criar outro objecto falso só para comparar o tipo de classe?
6 answers
Tenta isto:
MyObject obj = new MyObject();
if(obj instanceof MyObject){System.out.println("true");} //true
Devido à herança, isto também é válido para interfaces:
class Animal {}
class Dog extends Animal {}
Dog obj = new Dog();
Animal animal = new Dog();
if(obj instanceof Animal){System.out.println("true");} //true
if(animal instanceof Animal){System.out.println("true");} //true
if(animal instanceof Dog){System.out.println("true");} //true
Para mais leitura sobre instanceof: http://mindprod.com/jgloss/instanceof.html
Se não quer ou não pode utilizar instanceof
, então compare comequals
:
if(obj.getClass().equals(MyObject.class)) System.out.println("true");
BTW-é estranho porque os dois casos Class
na sua declaração realmente devem ser os mesmos, pelo menos no seu código de exemplo. Eles podem {[9] } ser diferentes se:
- As classes têm o mesmo nome curto, mas são definidas em pacotes diferentes
- As classes têm o mesmo nome completo, mas são carregadas por diferentes carregadores de classe.
E em resposta a este comentário:
Eu sei que tenho um erro na minha cabeça. pergunta. Eu devia ser assim:
MyImplementedObject obj = new MyImplementedObject ();
if(obj.getClass() == MyObjectInterface.class) System.out.println("true");
Os meus instrumentos de objectivo aplicados Por outras palavras, Eu... manha comparando-a com a sua implementação objecto.
OK, se você quiser verificar que você pode fazer qualquer um:
if(MyObjectInterface.class.isAssignableFrom(obj.getClass()))
Ou o muito mais conciso
if(obj instanceof MyobjectInterface)
Neste caso, se você quiser considerar estes como a mesma classe (que pode ser razoável, dependendo do caso), você pode combinar seus nomes para compará-los.
public static boolean areClassesQuiteTheSame(Class<?> c1, Class<?> c2) {
// TODO handle nulls maybe?
return c1.getCanonicalName().equals(c2.getCanonicalName());
}
Tenha em mente que isto a comparação fará exatamente o que faz: comparar nomes de classe; eu não acho que você será capaz de lançar de uma versão de uma classe para a outra, e antes de olhar para a reflexão, você pode querer se certificar de que há uma boa razão para a sua confusão classloader.
public boolean equals(Object obj) {
return (this == obj);
}
Hmmm... Tenha em mente que a classe pode ou não implementar iguais() -- isso não é exigido pela especificação. Por exemplo, o HP Fortify marcará a minha classe.igual a (myOtherClass).