Comparing Class Types in Java

前端 未结 8 2033
不知归路
不知归路 2020-12-14 06:07

I want to compare the class type in Java.

I thought I could do this:

class MyObject_1 {}
class MyObject_2 extends MyObject_1 {}

public boolean funct         


        
相关标签:
8条回答
  • 2020-12-14 06:12

    If you had two Strings and compared them using == by calling the getClass() method on them, it would return true. What you get is a reference on the same object.

    This is because they are both references on the same class object. This is true for all classes in a java application. Java only loads the class once, so you have only one instance of a given class at a given time.

    String hello  = "Hello";
    String world = "world";
    
    if (hello.getClass() == world.getClass()) {
        System.out.println("true");
    } // prints true
    
    0 讨论(0)
  • 2020-12-14 06:14

    It prints true on my machine. And it should, otherwise nothing in Java would work as expected. (This is explained in the JLS: 4.3.4 When Reference Types Are the Same)

    Do you have multiple classloaders in place?


    Ah, and in response to this comment:

    I realise I have a typo in my question. I should be like this:

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

    MyImplementedObject implements MyObjectInterface So in other words, I am comparing it with its implemented objects.

    OK, if you want to check that you can do either:

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

    or the much more concise

    if(obj instanceof MyobjectInterface)
    
    0 讨论(0)
  • 2020-12-14 06:15

    Hmmm... Keep in mind that Class may or may not implement equals() -- that is not required by the spec. For instance, HP Fortify will flag myClass.equals(myOtherClass).

    0 讨论(0)
  • 2020-12-14 06:20

    Check Class.java source code for equals()

    public boolean equals(Object obj) {
      return this == obj;
    }
    
    0 讨论(0)
  • 2020-12-14 06:23

    Try this:

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

    Because of inheritance this is valid for interfaces, too:

    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
    

    For further reading on instanceof: http://mindprod.com/jgloss/instanceof.html

    0 讨论(0)
  • 2020-12-14 06:25

    Comparing an object with a class using instanceOf or ... is already answered.

    If you have two objects and you want to compare their types with each other, you can use:

    if (obj1.getClass() == obj2.getClass()) {
       // Both have the same type
    }
    
    0 讨论(0)
提交回复
热议问题