我试图修复一个未知比较器的问题(没有源访问).
所以我写了一些反射代码来查看比较器接受的类型.
令人惊讶的是,Reflection告诉我,有两个比较方法,一个是真实类型,另一个是Object:
Comparator comp = new Comparator()
{
@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)
第二个比较方法来自何处?
但它不可用,为什么?:
comp.compare(1, 2); //Compiles
comp.compare((Object)1,(Object)2); //Does not Compile
然而,我可以用反射调用那些方法,如果我用新的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,那么只有一个Method.