我正在尝试修复一个未知比较器(无源代码访问)。因此,我编写了一些反射代码来查看该比较器接受哪些类型。令人惊讶的是,反射告诉我,有两个compare方法,一个是真实类型,一个是Object。
如果我用Object来定义我的比较器(Comparator), 那么只会有一个方法。
Comparator<Integer> comp = new Comparator<Integer>()
{
@Override
public int compare(Integer o1, Integer o2)
{
return 0;
}
};
Method[] methods = comp.getClass().getMethods();
for (Method method : methods)
{
if(method.getName().equals("compare")){
System.out.println(method);
}
}
输出:
public int de.hinneLinks.stackoverflow.MyClass$1.compare(java.lang.Integer,java.lang.Integer)
public int de.hinneLinks.stackoverflow.MyClass$1.compare(java.lang.Object,java.lang.Object)
第二个compare方法来自哪里?
但它无法使用,为什么呢?
comp.compare(1, 2); //Compiles
comp.compare((Object)1,(Object)2); //Does not Compile
然而,我可以使用反射调用这些方法。如果我使用 new Object()
调用这两个方法,那么我将会得到两个不同的异常:
compare(java.lang.Object,java.lang.Object)
java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.Integer
compare(java.lang.Integer,java.lang.Integer)
java.lang.IllegalArgumentException: argument type mismatch
如果我用Object来定义我的比较器(Comparator), 那么只会有一个方法。