2012-02-26 16 views
14

Nie rozumiem, dlaczego np. metoda java.security.MessageDigest.digest() która jest zadeklarowana jako powrót byte[] w Javie zwraca ByteArray w Kotlin Kotlin chociaż wydaje zwykle zadzwonić byte[]Array<Byte>.Różnica między ByteArray i Array <Byte> w kotlinie

E.g. następujące nie działa:

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

Type mismatch: wywnioskować typ jest ByteArray? ale Array<Byte>? oczekiwano

+0

Bieżące dokumenty dotyczące tablic Kotlin: https://kotlinlang.org/docs/reference/basic-types.html#arrays i do współdziałania z tablicami Java od Kotlina: https://kotlinlang.org/docs/reference/java -interop.html # java-array –

Odpowiedz

25

Ze względu na ograniczenia Javy, Kotlin posiada 9 rodzajów tablicy: Array < ...> dla tablic odniesienia (w sensie JVM) i 8 wyspecjalizowanych typów tablicowych, czyli IntArray, ByteArray itp

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

głównym powodem tej różnicy jest wydajność: jeśli nie Specjalizuj tablice, które doprowadziłyby do wielu boksów/rozpakowywania i spowolnienia tablic. Byłoby to nie do przyjęcia, ponieważ jedynym powodem, dla którego ktoś mógłby chcieć preferować tablice w kolekcjach, jest wydajność.

4

Krótko mówiąc, tylko na przyszłość.

ByteArray równa byte [] w Javie
Array < Byte> równa Byte [] w Javie

Brak korzyści ze stosowania jednego nad drugim w Kotlin, tylko jeśli kod ma być przetwarzany na Javę.

+0

Jest korzyść z używania ByteArray, każdy wpis jest prymitywny, więc ByteArray wymaga mniej pamięci i potencjalnie zapisuje niektóre auto-boxing. – Andy

Powiązane problemy