当前位置: 首页 > 面试题库 >

具有默认(程序包)可见性替代的Android方法(不起作用,但是可以-为什么?)

彭星津
2023-03-14
问题内容

我一直在研究Android中对SVG的支持,并提出了这个库,该库声称它支持SVG,就像它们本身一样。

由于我不遗余力地发现这实际上是不可能的,所以我去看看这个家伙实际上是如何做到的。因此,我了解了他的Resources派生方法,在他的派生方法中,他声明了一个在基础Resources类loadDrawable中具有
默认可见性 的方法()。

有趣的是,通常lint会报告您无法编写此方法,因为它会隐藏基本方法,但是在这种特殊情况下(请注意 指令
缺失@Override),该方法就像在基类。所有调用此方法的方法都将调用重写,而不是原始方法。对于来自经典编译器(例如C++或)的我来说Pascal,这完全是无法理解的。

基于此,我一次使用反射就使SVG支持完全起作用,对此我感到非常高兴,但是:

为什么这样做?


问题答案:

似乎Dalvik解释器中存在一个错误,该错误允许重写程序包专用方法。显然,Google意识到了这个问题(在Jelly
Bean中?),因为Dalvik报告了警告,指出在这种情况下它错误地覆盖了package-private方法,而ART报告为错误并且无法编译它。正确的行为当然是允许它,但不允许从其他程序包覆盖程序包私有方法,但是Google似乎希望避免破坏依赖于此行为的现有应用程序。

更新: 这是目前正式确认在ART文档更新于6月16日,尽管它指出ART发出警告,而不是一个严重错误的威利斯报道关于该问题的评论:

Dalvik错误地允许子类覆盖包专用方法。ART在以下情况下发出警告:

在Android 4.1之前的版本中,方法void com.foo.Bar.quux()
会错误地覆盖
com.quux.Quux中的package-private方法。

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



 类似资料:
  • 问题内容: 我在CSS中添加了一个“扰流器”类,用于扰流器。文本通常是不可见的,但是当鼠标悬停在其上方以向想要阅读该文本的任何人显示扰流板时,该文本就会出现。 应该很简单,但是由于某种原因这是行不通的。即使我将鼠标指向文字,文字仍然不可见。知道是什么原因造成的吗? 问题答案: 您不能将鼠标悬停在隐藏的元素上。一种解决方案是将元素嵌套在另一个容器中: CSS: HTML: 更新资料 在Chrome上

  • 问题内容: 在下面的小提琴中,我分别对可见性和不透明度进行了过渡。后者有效,但前者无效。此外,在可见的情况下,过渡时间被解释为悬停时的延迟。在Chrome和Firefox中都会发生。这是错误吗? 情况1: 情况2: 问题答案: 这不是错误 -您只能在有序/可计算的属性上进行转换(一种简单的想法是,任何具有数字开始和结束数字值的属性。尽管有一些例外)。 这是因为过渡通过计算两个 值 之间的关键帧并通

  • 我试图通过数据绑定来设置布局可见性。从数据库加载数据时,我在XML中设置的默认可见性不起作用。这是布局文件 视图模型是这样的 我有什么遗漏吗?默认情况下,我希望将错误布局的可见性设置为不可见。但默认情况下会显示它。

  • 问题内容: 为什么我不能使用默认方法实现创建一个? 问题答案: 您可以在功能接口中使用默认方法,但是其约定要求您提供一个单一的抽象方法(或SAM)。由于默认方法具有实现,因此它不是抽象的。 从概念上讲,功能接口仅具有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。 和 如果使用此注释类型对类型进行注释,则编译器需要生成错误消息,除非: 该类型是接口类型,而不是注释类型,枚举或类。 带注释的

  • 为什么我不能用默认的方法实现创建一个?

  • 问题内容: 我想知道是否可以将默认的Android OS语言更改为其他语言。例如,其语言不在设置中:如何以编程方式将设备的语言设置为缅甸语。 问题答案: 使用此程序以编程方式更改语言- 无论您要使用哪种语言,都可以在“ en_US”的地方写上语言的国家代码,例如日语–“ ja_JP”阿拉伯语–“ ar”,或者在此链接中查找国家/地区代码– http://code.google.com/apis/i