2012-02-26 11 views
14

No entiendo por qué p. Ej. el método java.security.MessageDigest.digest() que se declara como devolver byte[] en Java devuelve un ByteArray en Kotlin, aunque Kotlin generalmente parece llamar al byte[] un Array<Byte>.Diferencia entre ByteArray y Array <Byte> en kotlin

E.g. el siguiente no funciona:

fun main(args : Array<String>) { 
    val md = java.security.MessageDigest.getInstance("SHA") 
    if (md == null) throw NullPointerException() 
    val result : Array<Byte>? = md.digest() 
} 

coinciden los tipos: tipo inferido es ByteArray? pero Array<Byte>? se esperaba

+0

Documentos actuales para las matrices de Kotlin: https://kotlinlang.org/docs/reference/basic-types.html#arrays y para la interoperabilidad con las matrices de Java de Kotlin: https://kotlinlang.org/docs/reference/java -interop.html # java-arrays –

Respuesta

25

Debido a las limitaciones de Java, Kotlin tiene 9 tipos de matriz: Array < ...> para matrices de referencias (en el sentido JVM) y 8 tipos de matriz especializados, es decir IntArray, etc. ByteArray

https://kotlinlang.org/docs/reference/java-interop.html#java-arrays

la principal razón de esta distinción es el rendimiento: si no lo hacíamos especializar matrices llevaría a una gran cantidad de boxeo/unboxing y ralentizaría las matrices. Esto sería inaceptable porque la única razón por la que uno podría preferir las matrices sobre colecciones es rendimiento.

4

Dicho en pocas palabras, solo para referencia futura.

ByteArray es igual byte [] en Java
matriz < Byte> es igual byte [] en Java

Sin beneficio del uso de uno sobre el otro en Kotlin, solo si el código debe analizarse en Java.

+0

Existe una ventaja de usar ByteArray, cada entrada es una primitiva, por lo que ByteArray requiere menos memoria y potencialmente guarda un poco de auto-boxing. – Andy

Cuestiones relacionadas