Java 为什么android.os.Bundle是最后一个类?

Java 为什么android.os.Bundle是最后一个类?,java,android,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

最近,我在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)
W/Bundle(6782):密钥访问令牌应为字节[],但值为java.lang.String。返回了默认值。
W/Bundle(6782):尝试强制转换生成的内部异常:
W/Bundle(6782):java.lang.ClassCastException:java.lang.String
W/Bundle(6782):位于android.os.Bundle.getByteArray(Bundle.java:1305)
当然,从
String
byte[]
的转换非常简单,因此我的想法是,如果
Bundle
正在查找
byte[]
但找到了
String
,则它会自动执行此转换。它还没有这样做是愚蠢的(而且它对几乎每种基本类型和一些不同的
对象
类型都有特定的getter和setter,而不是只在
对象
或最坏的
数字
字符串
可打包
方面工作的通用类型),在我看来

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

还有,关于如何解决这个问题有什么想法吗?一个包装器类是不存在的,因为它没有通用的
接口
(实际导致问题的代码是第三方库的一部分,所以我不能仅仅更新它以直接引用包装器类)


我想这就留下了唯一的选项,可以搜索代码中所有碰巧设置
String
值的位置,这些值是第三方代码希望作为字节数组传递的内容。

如果您有一个字符串想要转换为字节数组,并且您不想在包之外处理该操作,你会怎么做

Bundle.putByteArray(String string) <<== ??

Bundle.putByteArray(String-String)该类是最终类,因为您不需要继承它。显示有很多方法可以
get
ing和
put
ing各种类型。如果您真的关心将
字符串
转换为
字节[]
,那么您要寻找的是Java方法(),而不是Android独有的东西。

基本上所有的“基元”类型都是最终的。这有几个原因。首先,捆绑包是可打包的,您可能会通过覆盖来破坏它的一些语义。另外,Bundle的意思是总是以某种方式运行。如果你重写了它,你可以改变人们期望的行为,甚至抛出一个以前被认为是安全的异常破坏代码。也可能有人认为,允许它是一个安全漏洞,因为他们可以用可以跟踪发生在它身上的事情的代码覆盖它。

可能是出于同样的原因,日志是最终的:让你生气。在C世界中,从字符串到字节[]的转换很简单,但并不明显(即Convert.FromBase64String,或Encoding.Utf8.GetBytes,或其他编码)。Java有官方字符串->字节[]转换吗?@Alexei Levenkov-是的,Java有。我不确定你会得到满足你的答案。你的论点似乎是(我恰好同意)final只是一个烦人的、不必要的机制,它没有任何作用,并且通过引入其他开发人员关于应该做什么或不应该做什么的假设来阻碍开发人员。但是我能想到的每一个final类都是这样的,除了程序员的傲慢之外,没有任何有用的理由。我怀疑这会有所不同nt for Bundle.Huh?声明类
final
如何减少cruft?对于一个作为SDK一部分的类,它预计将被数十万(而不是数百万)开发人员使用,我希望SDK架构师不愿意将任何类设为final,因为很难预测所有这些开发人员所使用的一切rs可能想这样做。让我们记住……我们谈论的是Bundle,一个字典类型的类,它只是用于打包数据以进行传输。确实很难预测那些数百万开发人员可能想做的一切,但我可以想象他们花费了他们的大部分精力试图预测那些数百万开发人员中的大多数人想要做的一切开发人员可能需要这样做。如果真的对您如此重要,我建议您提交一个SDK更改请求。