Gần đây, tôi đã gặp phải một số vấn đề với android.os.Bundle
mà tôi hy vọng khắc phục bằng cách đơn giản mở rộng lớp học và làm cho nó được nhập gọn hơn. Các vấn đề cụ thể mà tôi chạy vào là lỗi như:Tại sao android.os.Bundle là một lớp học cuối cùng?
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)
Tất nhiên, chuyển đổi từ String
để byte[]
là tầm thường, vì vậy suy nghĩ của tôi là chỉ có các Bundle
tự động làm chuyển đổi này nếu nó tìm kiếm một byte[]
nhưng thấy thay vào đó, hãy thay thế một số String
. Thật ngớ ngẩn khi nó không thực hiện điều này (và cũng có các getters và setters cụ thể cho khá nhiều mỗi loại nguyên thủy và một vài loại khác nhau Object
thay vì loại chung chung chỉ hoạt động theo số Object
hoặc ít nhất là Number
, String
và Parcelable
), theo ý kiến của tôi.
Nhưng dù sao, tôi nhanh chóng phát hiện ra rằng tôi không thể khắc phục sự cố bằng cách mở rộng Bundle
, bởi vì nó được khai báo final
. Có bất kỳ lý do đã biết/cụ thể nào cho điều này không? Có các lớp khác trong số android.os
không phải là final
, vì vậy điều gì làm cho Bundle
xứng đáng với việc gán này?
Ngoài ra, có ý tưởng nào về cách giải quyết vấn đề này không? Lớp bao bọc là không có interface
phổ biến để nó triển khai (mã thực sự gây ra sự cố là một phần của thư viện của bên thứ ba, vì vậy tôi không thể cập nhật nó để tham chiếu trực tiếp đến lớp trình bao bọc).
Tôi đoán rằng để nguyên tùy chọn duy nhất tìm kiếm tất cả các vị trí trong mã xảy ra để thiết lập các giá trị String
cho những thứ mà mã của bên thứ ba dự kiến được chuyển thành mảng byte.
Có lẽ vì lý do tương tự Nhật ký là cuối cùng: để piss bạn ra. – AedonEtLIRA
Trong chuyển đổi C# thế giới từ chuỗi thành byte [] là tầm thường, nhưng không rõ ràng (ví dụ: Convert.FromBase64String hoặc Encoding.Utf8.GetBytes hoặc một số mã hóa khác). Java có chuyển đổi String-> byte [] chính thức không? –
@Alexei Levenkov - Có, Java có [String.getBytes()] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes()). – aroth