2012-02-26 39 views
14

Tôi không hiểu tại sao ví dụ: phương thức java.security.MessageDigest.digest() được khai báo là trả về byte[] trong Java trả về một ByteArray trong Kotlin mặc dù Kotlin thường có vẻ như gọi byte[] một Array<Byte>.Sự khác biệt giữa ByteArray và Array <Byte> trong kotlin

Ví dụ: sau không làm việc:

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

Loại không phù hợp: suy ra loại là ByteArray? nhưng Array<Byte>? đã được dự kiến ​​

+0

Tài liệu hiện tại cho mảng Kotlin: https://kotlinlang.org/docs/reference/basic-types.html#arrays và để tương tác với các mảng Java từ Kotlin: https://kotlinlang.org/docs/reference/java -interop.html # java-arrays –

Trả lời

25

Do những hạn chế của Java, Kotlin có 9 loại mảng: Mảng < ...> cho mảng tài liệu tham khảo (theo nghĩa JVM) và 8 loại mảng chuyên ngành, tức là IntArray, ByteArray, vv

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

lý do chính cho sự khác biệt này là hiệu suất: nếu chúng ta không chuyên mảng nó sẽ dẫn đến rất nhiều boxing/unboxing và làm cho mảng chậm. Điều này sẽ không thể chấp nhận được vì lý do duy nhất mà người ta có thể muốn sử dụng các mảng trên các bộ sưu tập là hiệu suất.

4

Nói ngắn gọn, chỉ để tham khảo trong tương lai.

ByteArray bằng byte [] trong Java
Mảng < Byte> bằng Byte [] trong Java

Không lợi ích từ việc sử dụng một trong khác trong Kotlin, chỉ khi mã được phân tích cú pháp sang Java.

+0

Có một lợi ích khi sử dụng ByteArray, mỗi mục nhập là một nguyên thủy, do đó ByteArray đòi hỏi ít bộ nhớ hơn và có khả năng tiết kiệm một số auto-boxing. – Andy

Các vấn đề liên quan