2012-02-26 21 views
14

Non capisco perché ad es. il metodo java.security.MessageDigest.digest() che viene dichiarato come restituito byte[] in Java restituisce un ByteArray in Kotlin anche se Kotlin di solito sembra chiamare un Array<Byte>.Differenza tra ByteArray e Array <Byte> in kotlin

E.g. il seguente non funziona:

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

Tipo non corrispondente: inferito tipo è ByteArray? ma Array<Byte>? previsioni

+0

Documenti attuali per gli array di Kotlin: https://kotlinlang.org/docs/reference/basic-types.html#arrays e per l'interoperabilità con gli array Java di Kotlin: https://kotlinlang.org/docs/reference/java -interop.html # java-array –

risposta

25

A causa di limitazioni di Java, Kotlin ha 9 tipi di matrice: Array < ...> per matrici di riferimenti (in senso JVM) e 8 tipi di matrice specializzati, cioè IntArray, ByteArray ecc

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

la ragione principale per questa distinzione le prestazioni: se non abbiamo specializzare gli array porterebbe a un sacco di boxe/unboxing e rendere gli array lenti. Ciò sarebbe inaccettabile perché l'unica ragione per cui si potrebbe preferire preferire gli array alle raccolte è la prestazione .

4

Detto in breve, solo per riferimento futuro.

ByteArray uguale byte [] in Java
Array < Byte> uguale Byte [] in Java

Nessun beneficio da utilizzando uno sopra l'altro in Kotlin, solo se il codice deve essere analizzato in Java.

+0

C'è un vantaggio nell'uso di ByteArray, ogni voce è una primitiva, quindi ByteArray richiede meno memoria e potenzialmente salva alcuni auto-box. – Andy