默认(包)可见性覆盖的Android方法(应该不起作用,但确实如此?)

时间:2014-04-11 07:01:27

标签: java android inheritance svg android-resources

我一直在玩Android中的SVG支持并想出了this库,声称它支持SVG,就像它们是原生的一样。

由于我在发现这不太可能的时候花了很大力气,我去看看这个家伙是如何实际管理它的。所以我找到了他的Resources derivative,他在其中声明了一个方法(loadDrawable),该方法在基础资源类中具有默认可见性

有趣的是,通常lint会报告你不能写这个方法,因为它会隐藏基本方法,但在这个特殊情况下(注意 absense of @Override指令< / strong>)可以调用此方法,就好像它是在基类中编写的一样。调用此方法的所有方法都将调用覆盖而不是原始方法。对于我来自C++Pascal等经典编译器,我完全无法理解。

基于此,我设法让我的SVG支持完全只使用一次反射,并对此感到非常高兴,但是:

为什么这样做?

1 个答案:

答案 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

  
     

如果您打算在其他包中覆盖类的方法,请将方法声明为publicprotected