webentwicklung-frage-antwort-db.com.de

Klassentypen in Java vergleichen

Ich möchte den Klassentyp in Java vergleichen.

Ich dachte, ich könnte das tun:

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");
}

Ich wollte vergleichen, ob das in die Funktion übergebene Objekt von MyObject_1 erweitert wurde oder nicht .. __Das funktioniert nicht Es scheint, als würde die Methode getClass () und die .class-Datei unterschiedliche Informationen liefern.

Wie kann ich zwei Klassentypen vergleichen, ohne ein weiteres Dummy-Objekt erstellen zu müssen, nur um den Klassentyp zu vergleichen?

39
Carven

Versuche dies:

MyObject obj = new MyObject();
if(obj instanceof MyObject){System.out.println("true");} //true

Wegen der Vererbung gilt dies auch für Schnittstellen:

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

Weitere Informationen zu instanzof: http://mindprod.com/jgloss/instanceof.html

44
Thor

Wenn Sie instanceof nicht verwenden möchten oder können, vergleichen Sie mit equals:

 if(obj.getClass().equals(MyObject.class)) System.out.println("true");

Übrigens - es ist seltsam, weil die beiden Class -Instanzen in Ihrer Anweisung wirklich identisch sein sollten, zumindest in Ihrem Beispielcode. Sie können unterschiedlich sein, wenn:

  • die Klassen haben denselben Kurznamen, sind jedoch in verschiedenen Paketen definiert
  • die Klassen haben den gleichen vollständigen Namen, werden jedoch von verschiedenen Klassenladeprogrammen geladen.
30
Andreas_D

Es druckt true auf meinem Rechner. Und es sollte, sonst würde nichts in Java wie erwartet funktionieren. (Dies wird in der JLS erläutert: 4.3.4 Wenn Referenztypen gleich sind )

Haben Sie mehrere Classloader im Einsatz?


Ah und als Antwort auf diesen Kommentar:

Ich merke, dass ich einen Tippfehler in meinem .__ habe. Frage. Ich sollte so sein:

MyImplementedObject obj = new MyImplementedObject ();
if(obj.getClass() == MyObjectInterface.class) System.out.println("true");

MyImplementedObject implementiert MyObjectInterface Also mit anderen Worten, ich vergleiche es mit seiner implementierten Objekte.

OK, wenn Sie überprüfen möchten, dass Sie Folgendes tun können:

if(MyObjectInterface.class.isAssignableFrom(obj.getClass()))

oder das viel prägnantere

if(obj instanceof MyobjectInterface)
9

Wie bereits erwähnt, funktioniert Ihr Code, sofern Sie nicht die gleichen Klassen in zwei verschiedenen Klassenladern geladen haben .. Dies kann der Fall sein, wenn Sie mehrere Versionen derselben Klasse gleichzeitig im Speicher benötigen oder ein paar seltsame Aktionen ausführen fliegende Zusammenstellung (wie ich bin).

In diesem Fall können Sie, wenn Sie diese als dieselbe Klasse betrachten möchten (was je nach Fall sinnvoll sein kann), deren Namen vergleichen, um sie zu vergleichen.

public static boolean areClassesQuiteTheSame(Class<?> c1, Class<?> c2) {
  // TODO handle nulls maybe?
  return c1.getCanonicalName().equals(c2.getCanonicalName());
}

Denken Sie daran, dass dieser Vergleich genau das tut, was er tut: Vergleichen Sie die Klassennamen; Ich denke nicht, dass Sie in der Lage sein werden, von einer Version einer Klasse zur anderen zu wechseln, und bevor Sie sich mit dem Nachdenken beschäftigen, sollten Sie sicherstellen, dass es einen guten Grund für Ihr Klassenlade-Durcheinander gibt.

3
djjeck

Überprüfen Sie den Quellcode von Class.Java auf equals ().

public boolean equals(Object obj) {
return (this == obj);
}
1
Li Tao

Das Vergleichen eines Objekts mit einer Klasse mit instanceOf oder ... ist bereits beantwortet.

Wenn Sie zwei Objekte haben und ihre Typen mit einander vergleichen möchten, können Sie Folgendes verwenden:

if (obj1.getClass() == obj2.getClass()) {
   // Both have the same type
}
0
Mahdi-Malv

Hmmm ... Beachten Sie, dass Class equals () implementieren kann oder nicht - das ist in der Spezifikation nicht erforderlich. Beispielsweise kennzeichnet HP Fortify myClass.equals (myOtherClass).

0
Max Tardiveau