2017-08-26 3 views
5

je tentais de faire quelque chose de similaire à this (en fait, vous n'avez pas besoin de lire le lien pour comprendre cette question, il est juste pour la référence), et j'écris ceci:Pourquoi AtomicInteger est abstrait à Kotlin? (Il fonctionne très bien en Java)

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

Le compilateur dit:

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

Je ne peux pas comprendre pourquoi il me demande de mettre en œuvre ces méthodes. Je ne les ai pas vus dans la classe AtomicInteger. Tout va bien en Java.

+1

c'est un type mappé pour Kotlin. –

+0

Oui, car 'kotlin.Number' est mappé sur' java.lang.Number' – ice1000

+0

Vous avez probablement rencontré ce bogue: https://youtrack.jetbrains.com/issue/KT-16087 – Ilya

Répondre

4

AtomicInteger étend java.lang.Number, mais dans Kotlin ce type est mapped à kotlin.Number.

En kotlin.Number ces méthodes abstraites sont définies (que vous pouvez voir dans son API):

toByte, toInt, toChar etc.

Si vous déboguer cette ligne de code: AtomicInteger(2).toByte() vous pouvez voir, que la méthode java.lang.Number::byteValue est utilisée, ceci est fait en utilisant certaines techniques de compilation.