Разница между 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>?
Ответы
Ответ 1
Из-за ограничений Java Kotlin имеет 9 типов массивов: Array <... > для массивов ссылок (в смысле JVM) и 8 специализированных типов массивов, то есть IntArray, ByteArray и т.д.
https://kotlinlang.org/docs/reference/java-interop.html#java-arrays
Основной причиной этого различия является производительность: если мы не специализировали массивы, это привело бы к большому количеству бокса/распаковки и медленному созданию массивов. Это было бы неприемлемо, потому что единственная причина, по которой вам хотелось бы предпочесть массивы над коллекциями, - производительность.
Ответ 2
Говоря кратко, просто для справок в будущем.
ByteArray равен байт [] в Java
Массив равен Байт [] в Java
Нельзя использовать один из них в Котлине, только если код должен анализироваться на Java.