【问题标题】:Kotlin - How to "lateinit" a var overrided from an interface?Kotlin - 如何“延迟初始化”从接口覆盖的 var?
【发布时间】:2016-04-20 21:42:11
【问题描述】:

我有一个名为UserManager的接口

interface UserManager {

    var user:User

    /* ... */
}

还有一个名为 UserManagerImpl 的类,它实现了 UserManager

class UserManagerImpl : UserManager {

    override var user: User // = must provide an User object

    /* ... */
}

这是我的问题:

如何允许另一个类随时在UserManager() 中设置User不要在属性声明旁边提供初始User 对象并让另一个类创建并提供一个User 实例)?

算一算

  1. 接口不能有 lateinit 属性
  2. 我希望User 是一个非空值,所以没有可以为空的属性(User?
  3. 我想使用字段访问而不是声明并在界面中使用setUser(User)getUser() 方法

【问题讨论】:

    标签: field kotlin


    【解决方案1】:

    确实,“接口不能具有 lateinit 属性”,但这并不妨碍实现类使用它:

    interface User
    
    interface UserManager {
        var user: User
    }
    
    class UserManagerImpl : UserManager {
        lateinit override var user: User
    }
    
    fun main(args: Array<String>) {
        val userManager: UserManager = UserManagerImpl()
        userManager.user = object : User {}
        println(userManager.user)
    }
    

    打印类似LateinitKt$main$1@4b1210ee

    【讨论】:

    • 优秀@mfulton26 !我试图使用override lateinit var user: User 而不是你的方法。 :)
    • 我猜应该在编译器中对错误的关键字顺序进行更好的诊断
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多