最近我遇到了一些与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
,那么让Bundle
自动执行此转换。在我看来,它不仅愚蠢,而且还有特定的getter和setter用于几乎每个基本类型和一些不同的Object
类型,而不是使用可以直接使用Object
或最坏的情况下使用Number
、String
和Parcelable
的通用类型。
但是,我很快发现无法通过扩展Bundle
来解决这个问题,因为它被声明为final
。这是有任何已知/具体原因吗?在android.os
中还有其他未被声明为final
的类,那么是什么使Bundle
值得被分配为final
?
此外,有什么解决方法吗?封装类不行,因为它没有共同的interface
需要实现(实际引起问题的代码是第三方库的一部分,所以我不能直接更新它来引用封装类)。
我想这只留下了一种选择,那就是找到代码中所有设置String
值的地方,以便第三方代码期望将其作为字节数组传递。