2012-02-26 11 views
14

Je ne comprends pas pourquoi par ex. la méthode java.security.MessageDigest.digest() qui est déclarée comme renvoyant byte[] en Java renvoie un ByteArray dans Kotlin bien que Kotlin semble généralement appeler byte[] et Array<Byte>.Différence entre ByteArray et Array <Byte> dans kotlin

E.g. ce qui suit ne fonctionne pas:

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

incompatibilité Type: Type inférée ByteArray? mais Array<Byte>? devrait

+0

Documents courants pour les baies Kotlin: https://kotlinlang.org/docs/reference/basic-types.html#arrays et pour l'interopérabilité avec les baies Java de Kotlin: https://kotlinlang.org/docs/reference/java -interop.html # java-arrays –

Répondre

25

En raison des limitations de Java, Kotlin dispose de 9 types de tableaux: Array < ...> pour les tableaux de références (dans le sens JVM) et 8 types de tableaux spécialisés, à savoir TabEntier, ByteArray etc.

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

la principale raison de cette distinction est la performance: si nous ne spécialiser les tableaux cela conduirait à beaucoup de boxe/unboxing et rendrait les tableaux plus lents. Ce serait inacceptable car la seule raison pour laquelle on pourrait préférer les tableaux aux collections est performance.

4

Dit en bref, juste pour référence future.

ByteArray est égal à octet [] en Java
Tableau < Byte> est égal à Byte [] en Java

Aucun avantage d'utiliser l'un sur l'autre dans Kotlin, seulement si le code doit être analysé en Java.

+0

Il y a un avantage à utiliser ByteArray, chaque entrée est une primitive, donc ByteArray nécessite moins de mémoire et permet potentiellement d'économiser de l'auto-boxing. – Andy

Questions connexes