我试图弄清楚是否有可能。一般来说,我试图做的是从超类的伴随对象中获取一个类的子类...在下面的剪辑中,将__
视为我需要的
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
。
非常感谢任何帮助!
答案 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风格的实用程序函数。