我有多个扩展另一个类的类.其中一些类具有与基类不同的默认上下文.在其他编程语言中,这不是问题,但在Java/Kotlin中,这似乎是不可能的,因为属性显然不是首先初始化的,而是在构造函数之后初始化的.

举个例子可能会更简单:

fun main() {
    var a = ClassA("ipsum")
}

abstract class Base(var word: String) {
    open var defaultPrefix: String = "lorem ".also(::println)

    init {
        println("init Base")
        word = defaultPrefix + word
        println("final value of word is '$word'")
    }
}

class ClassA(word: String) : Base(word) {
    override var defaultPrefix: String = "foobar ".also(::println)
}

class ClassB(word: String) : Base(word) {
    // methods will differ but it will have the same defaultContext as Base
}

不幸的是,这个代码不工作,因为defaultPrefixnull. 下面是输出:

lorem 
init Base
final value of word is 'nullipsum'
foobar

显然,Base类中的init个在属性初始化之前被调用. 有没有办法在调用init之前初始化该属性,这样在我的示例中word就是foobar ipsum

推荐答案

这应该会发生NOT次.无论上下文如何,AString都应该是不可为空的类型.请在YouTrack处提交窃听器.similar bug还指出,不可为空的变量正被设置为空.

无论如何,这是一个您可以使用的解决方案:

fun main() {
    var a = ClassA("ipsum")
}

abstract class Base(var word: String) {
    open val defaultPrefix: String
        get() = "lorem ".also(::println)

    init {
        println("init Base")
        word = defaultPrefix + word
        println("final value of word is '$word'")
    }
}

class ClassA(word: String) : Base(word) {
    override val defaultPrefix: String
        get() = "foobar ".also(::println)
}

class ClassB(word: String) : Base(word) {
    // methods will differ but it will have the same defaultContext as Base
}

Kotlin相关问答推荐

直接从SON解析NonEmptyList

Kotlin:类型不匹配:推断的类型已运行,但应等待

为什么 trySend 会发出假数据?

如何规避 Kotlin 的泛型类型差异约束

通用接口继承

你怎么知道什么时候需要 yield()?

Kotlin 中列表或数组的乘积

未为任务启用 Gradle 构建缓存

Kotlin 的 isNullOrBlank() 函数是否可以导入 xml 以用于数据绑定

无法为 retrofit2.Call 调用无参数构造函数

更新到版本4.10.1/4.10.2后 Gradle 同步失败

如何将vararg转换为list?

Android 与 Kotlin - 如何使用 HttpUrlConnection

Kotlin 的 Double.toInt() 中使用了哪种方法,舍入还是截断?

我们如何在Java注释声明中引用Kotlin常量?

Kotlin - 是否可以在类中的 init 块之前初始化伴随对象?

保存对象时未填充 Spring Boot JPA@CreatedDate @LastModifiedDate

如何在 Gradle Kotlin DSL 中使用来自 gradle.properties 的插件版本?

Kotlin 对象 vs 伴生对象(companion-object) vs 包作用域(package scoped)方法

如何在 IntelliJ IDEA 中禁用粘贴时将 Java 转换为 Kotlin?