【问题标题】:Is it possible to get a Kotlin subclass type from within a superclass?是否可以从超类中获取 Kotlin 子类类型?
【发布时间】:2017-11-02 01:29:06
【问题描述】:

我正试图弄清楚是否有可能。一般来说,我想做的是从超类的伴随对象中获取子类的类类型......在下面的片段中,将__视为我需要的

companion object
{
    fun fromSnapshot(snapshot: DataSnapshot): __
    {
        val model = snapshot.getValue(__)
        model.key = snapshot.key
        // ...
        return model
    }
}

一些背景...DataSnapshot 来自 Firebase,snapshot.getValue() 采用 Class<T>。如果我试图创建一个TestModel 的实例,代码如下

companion object
{
    fun fromSnapshot(snapshot: DataSnapshot): TestModel
    {
        val model = snapshot.getValue(TestModel::java.class)
        model.key = snapshot.key
        // ...
        return model
    }
}

我不确定我所问的是否在 Kotlin 中可行。我很确定它不在Java中。我不想提它,但在 Swift 中,这将通过我所谓的“big-S self”或Self 来完成,它是实例self 的类类型。如果你不了解 Swift,self 相当于 Java 和 Kotlin 的this

任何帮助将不胜感激!

【问题讨论】:

    标签: android firebase firebase-realtime-database kotlin


    【解决方案1】:

    从您的代码来看,它似乎是一个非常通用的函数。 T 是什么以及这个函数存在于哪个伴生对象中并不重要,所以我有另一个版本:

    inline fun <reified T : FirebaseModel> DataSnapshot.toModelOfType() = 
        getValue(T::class.java).also { it.key = this.key}
    

    可以这样使用:

    someSnapshot.toModelOfType<SomeFirebaseModel>()
    

    代替你的

    FirebaseModel.fromSnapshot<SomeFirebaseModel>(someSnapshot)
    

    或进口

    fromSnapshot<SomeFirebaseModel>(someSnapshot)
    

    我更喜欢我的,因为它比没有导入的版本更短,并且比有导入的版本更流畅。

    我个人建议更喜欢扩展函数而不是 Java 风格的实用函数

    【讨论】:

    • 我喜欢它!非常感谢。我是 Kotlin 的新手,但精通 Java,所以我确实倾向于使用类似 Java 的样式,但我完全赞成 Kotlin 风格的约定。需要一个词来形容“Kotlin-y”
    【解决方案2】:

    即使我在这个问题上坐了好几天都没有发布问题,但在发布这个问题后不到一个小时我就明白了。这可以通过reified generic type 来完成,它允许在函数内使用泛型类型,但是这些只能用作inline 函数。这是我的解决方案

    companion object
    {
        inline fun <reified T : FirebaseModel> fromSnapshot(snapshot: DataSnapshot): T
        {
            val model = snapshot.getValue(T::class.java)
            model.key = snapshot.key
            return model
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2023-03-14
      • 2019-09-20
      • 1970-01-01
      相关资源
      最近更新 更多