Разница между ByteArray и Array <Byte>в котлине - PullRequest
17 голосов
/ 27 февраля 2012

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

например. следующее не работает:

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>?

Ответы [ 2 ]

33 голосов
/ 27 февраля 2012

Из-за ограничений Java у Kotlin есть 9 типов массивов: Array <...> для массивов ссылок (в смысле JVM) и 8 специализированных типов массивов, т.е. IntArray, ByteArray и т. Д.

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

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

10 голосов
/ 25 мая 2017

Короче говоря, просто для дальнейшего использования.

ByteArray равно байт [] в Java
Array равно Byte [] в Java

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

...