我最近遇到了 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)
当然,从 String
到 byte[]
的转换很简单,所以我的想法是让 Bundle
自动执行此转换如果它正在寻找 byte[]
但找到的是 String
。愚蠢的是它还没有这样做(而且它有特定的 getter 和 setter 用于几乎 每个 原始类型和一些不同的 Object
类型而不是通用类型在我看来,这仅适用于 Object
,或者在最坏的情况下是 Number
、String
和 Parcelable
) .
但无论如何,我很快发现我无法通过扩展 Bundle
来解决问题,因为它被声明为 final
。这有什么已知/具体的原因吗? android.os
中还有其他类不是final
,那么是什么让 Bundle
值得这个分配呢?
此外,关于如何解决这个问题有什么想法吗?一个包装类已经出来了,因为它没有通用的 interface
来实现(实际导致问题的代码是第三方库的一部分,所以我不能直接更新它来引用到包装类)。
我想剩下的唯一选择就是寻找代码中恰好为第三方代码希望作为字节数组传递的事物设置 String
值的所有位置。
最佳答案
基本上所有“原始”类型都是最终类型。这有几个原因。首先,bundle 是可分割的,如果它的语义被覆盖,你可能会破坏一些。此外,Bundle 意味着始终以某种方式行事。如果你覆盖它,你可以改变人们期望的行为,甚至抛出一个异常中断代码,以前被认为是安全的。也可能有人争辩说,允许它会是一个安全漏洞,因为他们可以用可以跟踪它发生了什么的代码覆盖它。
关于java - 为什么 android.os.Bundle 是最终类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9321066/