2012-02-26 10 views
14

Я не понимаю, почему, например, метод java.security.MessageDigest.digest(), объявленный как возвращаемый byte[] в Java, возвращает ByteArray в Котлине, хотя, как правило, Котлин обычно вызывает byte[] a Array<Byte>.Разница между ByteArray и Array <Byte> в kotlin

E.g. следующий не работает:

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

Несоответствие типов: вывод типа ByteArray? но Array<Byte>? Ожидалось

+0

Текущие документы для массивов Kotlin: https://kotlinlang.org/docs/reference/basic-types.html#arrays и для взаимодействия с массивами Java от Kotlin: https://kotlinlang.org/docs/reference/java -interop.html # java-arrays –

ответ

25

Из-за ограничения Явы, Котлин имеет 9 типов массива: Array < ...> для массивов ссылков (в JVM смысле) и 8 специализированных типов массивов, т.е. INTArray, ByteArray и т.д.

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

основной причиной такого различия является производительность: если мы не сделали специализируясь на массивах, это приведет к большому количеству бокса/распаковки и медленному созданию массивов. Это было бы неприемлемо, потому что единственной причиной, по которой можно было бы предпочесть массивы над коллекциями, является производительность.

4

Вкратце сказано, просто для справок в будущем.

ByteArray равна байт [] в Java
Массив < Byte> равен Byte [] в Java

Нет выгоды от использования одного над другим в Котлин, только если код должен анализироваться на Java.

+0

Существует преимущество использования ByteArray, каждая запись является примитивной, поэтому ByteArray требует меньше памяти и потенциально экономит некоторый авто-бокс. – Andy