java - 为什么 android.os.Bundle 是最终类?

标签 java android

我最近遇到了 android.os.Bundle 的一些问题,我希望通过简单地扩展类并使其类型更松散来解决这些问题。我遇到的具体问题是这样的错误:

W/Bundle  ( 6782): Key access_token expected byte[] but value was a java.lang.String.  The default value <null> was returned.
W/Bundle  ( 6782): Attempt to cast generated internal exception:
W/Bundle  ( 6782): java.lang.ClassCastException: java.lang.String
W/Bundle  ( 6782):  at android.os.Bundle.getByteArray(Bundle.java:1305)

当然,从 Stringbyte[] 的转换很简单,所以我的想法是让 Bundle 自动执行此转换如果它正在寻找 byte[] 但找到的是 String。愚蠢的是它还没有这样做(而且它有特定的 getter 和 setter 用于几乎 每个 原始类型和一些不同的 Object 类型而不是通用类型在我看来,这仅适用于 Object,或者在最坏的情况下是 NumberStringParcelable) .

但无论如何,我很快发现我无法通过扩展 Bundle 来解决问题,因为它被声明为 final。这有什么已知/具体的原因吗? android.os 中还有其他类不是final,那么是什么让 Bundle 值得这个分配呢?

此外,关于如何解决这个问题有什么想法吗?一个包装类已经出来了,因为它没有通用的 interface 来实现(实际导致问题的代码是第三方库的一部分,所以我不能直接更新它来引用到包装类)。

我想剩下的唯一选择就是寻找代码中恰好为第三方代码希望作为字节数组传递的事物设置 String 值的所有位置。

最佳答案

基本上所有“原始”类型都是最终类型。这有几个原因。首先,bundle 是可分割的,如果它的语义被覆盖,你可能会破坏一些。此外,Bundle 意味着始终以某种方式行事。如果你覆盖它,你可以改变人们期望的行为,甚至抛出一个异常中断代码,以前被认为是安全的。也可能有人争辩说,允许它会是一个安全漏洞,因为他们可以用可以跟踪它发生了什么的代码覆盖它。

关于java - 为什么 android.os.Bundle 是最终类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9321066/

相关文章:

java - 使用 RecyclerView 适配器在运行时更改布局屏幕

java - 不支持的 major.minor 版本 52.0

java - 为什么 Hibernate 允许我在外键约束上插入空值?

android - Activity onBackPress 不显示警报对话框

java - Android设置具体时间和在Alarmmanager

android - getString(R.string.res_name) 给出 java.lang.IndexOutOfBoundsException

java - 如何在Android中选择上一个微调器时获取微调器项目?

java - mockito stub 返回 null

java - Swing:如何使用多个按钮?

android - 内容观察者是观察者模式的实现吗?