【问题标题】:Why AtomicInteger is abstract in Kotlin? (it works fine in Java)为什么 AtomicInteger 在 Kotlin 中是抽象的? (它在 Java 中运行良好)
【发布时间】:2018-02-04 07:52:09
【问题描述】:

我正在尝试制作类似于this的东西(实际上您不需要阅读链接即可理解这个问题,仅供参考),我写了这个:

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

编译器说:

错误:(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

我不明白为什么它需要我实现这些方法。我在AtomicInteger 课程中没有看到它们。 Java 中的一切都很好。

【问题讨论】:

  • 它是 Kotlin 的映射类型。
  • 是的,因为kotlin.Number 映射到java.lang.Number
  • 看来你遇到过这个bug:youtrack.jetbrains.com/issue/KT-16087
  • 想起一句古话:“直钩,咸鱼”

标签: java kotlin retrofit


【解决方案1】:

AtomicInteger 扩展了 java.lang.Number,但在 Kotlin 中,这种类型是 mappedkotlin.Number

kotlin.Number 中定义了这些抽象方法(您可以在其API 中看到):

toBytetoInttoChar

如果您调试这行代码:AtomicInteger(2).toByte(),您可以看到,使用了方法java.lang.Number::byteValue,这是通过使用某些编译器技术完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多