我一直在玩Android中的SVG支持并想出了this库,声称它支持SVG,就像它们是原生的一样。
由于我在发现这不太可能的时候花了很大力气,我去看看这个家伙是如何实际管理它的。所以我找到了他的Resources
derivative,他在其中声明了一个方法(loadDrawable
),该方法在基础资源类中具有默认可见性。
有趣的是,通常lint会报告你不能写这个方法,因为它会隐藏基本方法,但在这个特殊情况下(注意 absense of @Override
指令< / strong>)可以调用此方法,就好像它是在基类中编写的一样。调用此方法的所有方法都将调用覆盖而不是原始方法。对于我来自C++
或Pascal
等经典编译器,我完全无法理解。
基于此,我设法让我的SVG支持完全只使用一次反射,并对此感到非常高兴,但是:
为什么这样做?
答案 0 :(得分:9)
看起来Dalvik解释器中存在一个错误,它允许覆盖包私有方法。显然,谷歌认识到了这个问题(在Jelly Bean中?),因为Dalvik报告了一个警告,即在这种情况下它错误地覆盖了一个包私有方法,并且ART将其报告为错误并且无法编译它。正确的行为当然是允许它但不允许从其他包中覆盖package-private方法,但看起来Google希望避免破坏依赖于此行为的现有应用程序。
更新:现在6月16日ART文档更新中正式confirmed,虽然它声明ART会发出警告而不是像velis reported那样的严重错误在对该问题的评论中:
Dalvik错误地允许子类覆盖package-private方法。在这种情况下,ART会发出警告:
在Android 4.1之前,方法void com.foo.Bar.quux()
会错误地覆盖中的package-private方法 com.quux.Quux如果您打算在其他包中覆盖类的方法,请将方法声明为
public
或protected
。