为什么android.os.Bundle是最后一堂课?

时间:2012-02-17 00:06:01

标签: 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)

当然,从String转换为byte[]是微不足道的,所以我的想法是让Bundle自动执行此转换,如果它正在寻找byte[]但是找到String代替。愚蠢的是它已经不会这样做了(而且它还有几个每个原始类型和几个不同Object类型的特定getter和setter,而不是那些只能工作的泛型类型在我看来,就Object或最差NumberStringParcelable而言。

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

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

我想这留下了唯一的选择,即搜索代码中的所有位置,这些位置恰好为第三方代码期望作为字节数组传递的内容设置String值。

3 个答案:

答案 0 :(得分:1)

基本上所有“原始”类型都是最终的。这有几个原因。首先,bundle应该是parceable,如果它的语义通过覆盖你可能会破坏一些。此外,Bundle总是以某种方式行事。如果你覆盖它,你可以改变人们期望的行为,甚至抛出一个以前被认为是安全的异常破坏代码。它也可能被认为是允许它的安全漏洞,因为它们可以用可以跟踪它发生的事情的代码覆盖它。

答案 1 :(得分:0)

如果你有一个字符串你想要转换为字节数组,并且你不想在Bundle之外处理那个动作,你会怎么做?

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

你已经有putByteArray()存储了一个ByteArray,putString()存储了一个字符串...正如你所说,转换是微不足道的,所以如果你必须有一个字符串作为一个ByteArray,为什么不在转换之前进行转换,然后在转出时转换回来?

至于为什么这个类是最终的,你已经确定它处理“非常每个原始类型和几个不同的Object类型”,所以为什么要扩大它有不必要的课程吗?方便,然后有冗余......

答案 2 :(得分:0)

课程是最终的,因为你不应该需要来继承它。 The documentation表明getput各种类型的方法有很多种。如果您真的担心将String转换为byte[],那么您正在寻找的是Java方法(click me),而不是Android独有的东西。