Подтвердить что ты не робот

Разница между ByteArray и Array <Byte> в kotlin

Я не понимаю, почему, например, метод java.security.MessageDigest.digest(), объявленный как возвращающий byte[] в Java, возвращает a ByteArray в Котлин, хотя, как правило, Котлин обычно вызывает byte[] an 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>?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Говоря кратко, просто для справок в будущем.

ByteArray равен байт [] в Java
Массив равен Байт [] в Java

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