是否有可能从超类中获取Kotlin子类?

时间:2017-06-01 04:06:18

标签: android firebase firebase-realtime-database kotlin

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

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中,这将通过我所说的&#34; big-S self,&#34;来完成。或Self,它是实例self的类类型。如果您不了解Swift,self相当于Java和Kotlin的this

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

即使我在没有发帖的情况下坐了好几天,但在发布这个问题后不到一个小时我就知道了。这可以使用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
    }
}

答案 1 :(得分: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风格的实用程序函数