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?

Author: Carven, 2011-05-27

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

 44
Author: Thor, 2011-05-27 09:06:52

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.
 27
Author: Andreas_D, 2011-05-27 08:32:56
Imprime na minha máquina. E deveria, caso contrário nada em Java funcionaria como esperado. (Isto é explicado no JLS: 4.3.4 quando os tipos de referência são os mesmos) Tem vários carregadores prontos?
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)
 9
Author: Sean Patrick Floyd, 2011-05-27 08:38:42
Como disse antes, o seu código funcionará a menos que tenha as mesmas classes carregadas em dois carregadores de classe diferentes. Isto pode acontecer no caso de você precisar de várias versões da mesma classe na memória ao mesmo tempo, ou você está fazendo algumas coisas estranhas na compilação fly (Como Eu sou).

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.
 3
Author: djjeck, 2013-09-20 01:52:54
Verifique A Classe.código-fonte java para igual a ()
public boolean equals(Object obj) {
return (this == obj);
}
 1
Author: Li Tao, 2015-01-23 21:40:25

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).

 0
Author: Max Tardiveau, 2016-09-23 02:20:29