Java 如何确定两个参数是否是相同但未知的类的实例?

Java 如何确定两个参数是否是相同但未知的类的实例?,java,reflection,types,compare,Java,Reflection,Types,Compare,假设我们有一个方法,它接受Object类型的两个参数o1和o2,并返回一个布尔值。我希望此方法仅在参数是同一类的实例时返回true,例如: foo(new Integer(4),new Integer(5)); 但是,应返回true: foo(new SomeClass(), new SubtypeSomeClass()); 应返回false,并且: foo(new Integer(3),"zoo"); 应该返回false 我认为一种方法是比较完全限定的类名: public boolean

假设我们有一个方法,它接受Object类型的两个参数o1和o2,并返回一个布尔值。我希望此方法仅在参数是同一类的实例时返回true,例如:

foo(new Integer(4),new Integer(5));
但是,应返回true:

foo(new SomeClass(), new SubtypeSomeClass());
应返回false,并且:

foo(new Integer(3),"zoo");
应该返回false

我认为一种方法是比较完全限定的类名:

public boolean foo(Object o1, Object o2){
 Class<? extends Object> c1 = o1.getClass();
 Class<? extends Object> c2 = o2.getClass();
 if(c1.getName().equals(c2.getName()){ return true;}
 return false;  
}

后一种选择相当缓慢。这个问题还有其他解决方法吗?

不用担心完全限定的类名,只需比较类引用即可:

public boolean foo(Object o1, Object o2) {
    return o1.getClass() == o2.getClass();
}
类在名称和类加载器方面本质上是唯一的——因此,如果对象具有相同的类名但由不同的类加载器加载,则返回false,但这可能是适当的:它们可以是除名称以外的所有完全不同的类!但是,如果类具有相同的名称和类加载器,它们将具有相同的引用


请注意,如果o1或o2为null,这将引发NullPointerException,但这可能也是您想要的。

不要担心完全限定的类名,只需比较类引用即可:

public boolean foo(Object o1, Object o2) {
    return o1.getClass() == o2.getClass();
}
类在名称和类加载器方面本质上是唯一的——因此,如果对象具有相同的类名但由不同的类加载器加载,则返回false,但这可能是适当的:它们可以是除名称以外的所有完全不同的类!但是,如果类具有相同的名称和类加载器,它们将具有相同的引用


请注意,如果o1或o2为空,这将引发NullPointerException,但这可能也是您想要的。

您是否可以相当慢地进行限定?和什么相比?还请详细说明您的使用场景?在java中,对象api包括一个equals/hashCode方法paring,该方法应用于标识对象之间的相等性。似乎这就是您可能要查找的内容,即:

new Integer(4).equals(new Integer(5))
在这种情况下,在SomeClass中重写equals的最佳实现如下所示:

public boolean equals(Object obj) {
    if (obj instanceof SomeClass) {
        return ((SomeClass) obj).identityField.equals(identityField);
    }
    return false;
}
public int hashCode() {
    return 31 * identity.hashCode();
}

确保您在对象中提供标识。

您能很慢地确定身份吗?和什么相比?还请详细说明您的使用场景?在java中,对象api包括一个equals/hashCode方法paring,该方法应用于标识对象之间的相等性。似乎这就是您可能要查找的内容,即:

new Integer(4).equals(new Integer(5))
在这种情况下,在SomeClass中重写equals的最佳实现如下所示:

public boolean equals(Object obj) {
    if (obj instanceof SomeClass) {
        return ((SomeClass) obj).identityField.equals(identityField);
    }
    return false;
}
public int hashCode() {
    return 31 * identity.hashCode();
}
确保在对象中提供标识