如何判断两个参数是否是同一个但未知类的实例?

1 java reflection types compare

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

foo(new Integer(4),new Integer(5));
Run Code Online (Sandbox Code Playgroud)

但应该返回true:

foo(new SomeClass(), new SubtypeSomeClass());
Run Code Online (Sandbox Code Playgroud)

应该返回false并且:

foo(new Integer(3),"zoo");
Run Code Online (Sandbox Code Playgroud)

应该返回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;  
}
Run Code Online (Sandbox Code Playgroud)

另一个条件陈述是:

if (c1.isAssignableFrom(c2) && c2.isAssignableFrom(c1)){ return true; }
Run Code Online (Sandbox Code Playgroud)

后一种选择相当缓慢.这个问题还有其他替代方案吗?

Jon*_*eet 10

不要打扰完全限定的类名 - 只需比较类引用:

public boolean foo(Object o1, Object o2) {
    return o1.getClass() == o2.getClass();
}
Run Code Online (Sandbox Code Playgroud)

类通过名称和类加载器本质上是唯一的 - 所以如果对象具有相同的类但由不同的类加载器加载,这将返回false ,但这可能是合适的:除了名称之外,它们可以是完全不同的类!但是,如果类具有相同的名称和类加载器,则它们将具有相同的引用.

请注意,这将抛出NullPointerExceptionif if o1o2null,但同样可能是你想要的.