似乎并不是所有的.equals()方法都是平等创建的。
我一直在安卓应用程序上测试向后兼容性,发现了一些奇怪的东西。当我在Froyo(2.2)下测试我的应用程序时,RectF.equals()在用于比较两个相同对象时失败。Rect.equals()在所有版本上都能正常工作,但RectF似乎在Froyo和Jelly Bean之间进行了彻底改革。在源代码中,RectF似乎从未覆盖.equals,只是使用了Object实现。然而,Rect.equals的情况并非如此。
Rect r1 = new Rect(0,0,1,1);
Rect r2 = new Rect(r1);
RectF rf1 = new RectF(0,0,1,1);
RectF rf2 = new RectF(rf1);
if (r1.equals(r2))
Log.d(Build.VERSION.RELEASE,"r1 and r2 are equal");
else
Log.d(Build.VERSION.RELEASE,"r1 and r2 are NOT equal");
if (rf1.equals(rf2))
Log.d(Build.VERSION.RELEASE,"rf1 and rf2 are equal");
else
Log.d(Build.VERSION.RELEASE,"rf1 and rf2 are NOT equal");
从上面的代码中可以看出,两个.equals()都会返回true。不是这样。Rect比较总是返回true,而RectF比较在我的Nexus 7上返回true,在其他所有设备上返回false。啊!
我花了一段时间才发现这个问题,因为我广泛使用了Rect对象,从来没有遇到过问题。我从未想过RectF会如此前后矛盾。
我的问题是:如何在不同版本之间轻松找到对Android源对象更改的引用《API参考》提到了新方法和弃用,但没有提到方法的行为何时发生了巨大变化。我还扫描了code.google.com上的错误列表,但一无所获。当我怀疑存在不一致时,他们是我可以使用的另一个在线资源吗我不想每次遇到问题都要浏览android源代码,因为我很难处理自己的错误/不一致例如,有没有一种简单的方法可以让我找到RectF的整个更改历史
谢谢,
RectF
类的equals()
方法中有一个拼写错误。错误是:
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
// RectF r = (Rect) o; <=== bug!
RectF r = (RectF) o;
return left == r.left && top == r.top && right == r.right && bottom == r.bottom;
}
如果你转到RectF的GitHub源代码并点击"历史记录",你会在2012年3月9日找到一个标题为"修复RectF.equals中的拼写错误"的条目。点击它,你可以看到更改。
我没有费心去追踪到底是哪个版本的安卓系统首先包含了这个修复程序。但由于它是最近才出现的,你应该预计在未来一段时间内,大多数设备都会出现这个错误。