31

我不明白为什么在 Javajava.security.MessageDigest.digest()中声明为返回的方法在 Kotlin 中返回 a 尽管 Kotlin 通常似乎调用.byte[]ByteArraybyte[]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>?预期的

4

2 回答 2

44

由于 Java 的限制,Kotlin 有 9 种数组类型:Array<...> 用于引用数组(在 JVM 意义上)和 8 种专用数组类型,即 IntArray、ByteArray 等。

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

这种区别的主要原因是性能:如果我们没有专门化数组,它会导致大量的装箱/拆箱并使数组变慢。这是不可接受的,因为人们可能更喜欢数组而不是集合的唯一原因是性能

于 2012-02-27T09:41:04.533 回答
27

简而言之,仅供参考。

ByteArray等于Java 中的byte[]
Array<Byte>等于Java 中的Byte[]

只有在将代码解析为 Java 的情况下,在 Kotlin 中使用其中一个并没有什么好处。

于 2017-05-24T21:31:38.843 回答