Recientemente me encontré con algunos problemas con android.os.Bundle
que esperaba solucionar simplemente ampliando la clase y haciéndola más imprecisamente tipada. El problema específico que me encontré era errores como:¿Por qué es android.os.Bundle una clase final?
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)
Por supuesto, la conversión de String
a byte[]
es trivial, por lo que mi pensamiento fue ir a tomar el Bundle
hacer esta conversión automáticamente si está buscando un byte[]
pero encuentra un String
en su lugar. Es una tontería que ya no lo haga (y también tiene getters y setters específicos para casi cada tipo primitivo y algunos tipos diferentes Object
en lugar de genéricos que simplemente funcionan en términos de Object
, o en el peor Number
, String
y Parcelable
), en mi opinión.
Pero de todos modos, descubrí rápidamente que no puedo solucionar el problema extendiendo Bundle
, porque está declarado final
. ¿Hay alguna razón conocida/específica para esto? Hay otras clases en android.os
que no son final
, entonces ¿qué hace que Bundle
sea digno de esta asignación?
Además, ¿alguna idea sobre cómo solucionar esto? Se ha eliminado una clase contenedora ya que no existe un interface
común para implementar (el código que realmente causa el problema es parte de una biblioteca de terceros, por lo que no puedo simplemente actualizarlo para referirme directamente a una clase contenedora).
Supongo que deja la única opción al buscar todos los lugares en el código que están configurando String
valores para cosas que el código de terceros espera pasar como matrices de bytes.
Probablemente por el mismo motivo Log is final: cabrear. – AedonEtLIRA
En C# la conversión mundial de String a byte [] es trivial, pero no obvia (es decir, Convert.FromBase64String, o Encoding.Utf8.GetBytes, o alguna otra codificación). ¿Tiene Java una conversión oficial de String-> byte []? –
@Alexei Levenkov - Sí, Java tiene [String.getBytes()] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes()). – aroth