2017-08-26 15 views
5

Starałem się zrobić coś podobnego do this (właściwie nie trzeba czytać w link, aby zrozumieć to pytanie, to tylko w celach informacyjnych), a piszę to:Dlaczego AtomicInteger jest abstrakcyjny w Kotlin? (Działa dobrze w Javie)

class CallArbiter: AtomicInteger { // error 
    constructor(initialValue: Int) : super(initialValue) 
    constructor() : super() 
} 

kompilator mówi:

Error:(8, 1) Kotlin: Class 'CallArbiter' must be declared abstract or implement abstract base class member public abstract fun toByte(): Byte defined in java.util.concurrent.atomic.AtomicInteger

nie mogę zrozumieć, dlaczego to wymaga mnie do wdrożenia tych metod. Nie widziałem ich w klasie AtomicInteger. Wszystko jest w porządku w Javie.

+1

to zmapowany typ dla Kotlin. –

+0

Tak, ponieważ 'kotlin.Number' jest zmapowany do' java.lang.Number' – ice1000

+0

Wygląda na to, że stanął wobec tego błędu: https://youtrack.jetbrains.com/issue/KT-16087 – Ilya

Odpowiedz

4

AtomicInteger rozszerza java.lang.Number, ale w Kotlin ten typ to mapped na kotlin.Number.

W kotlin.Number zdefiniowane są te metody abstrakcyjne (co widać w jego API):

toByte, toInt, toChar itp

Jeśli debugowania tego wiersza kodu: AtomicInteger(2).toByte() widać, że używana jest metoda java.lang.Number::byteValue, odbywa się to za pomocą pewnych technik kompilacji.

Powiązane problemy