是否可以从超类中获取Kotlin子类型?
问题描述:
我想弄清楚是否有可能。一般情况下,我想要做的是从超类的同伴对象中获取类类型的子类的......在下面的剪断,对待__
因为我需要什么是否可以从超类中获取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
}
}
我真的不知道,如果我要问在科特林是可能的。我很确定它不在Java中。我讨厌提及它,但在Swift中,这可以通过我称之为“big-S self”或Self
来实现,它是实例self
的类类型。如果你不知道Swift,self
就相当于Java和Kotlin的this
。
任何帮助将非常感激!
答
从您的代码,它似乎是一个非常通用的功能。不要紧,什么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风格实用功能的扩展功能。
答
即使我坐在这几天没有发布问题,我发现不到一个小时后发布这个问题。这可以通过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
}
}
我喜欢它!非常感谢。我是Kotlin的新手,但擅长Java,所以我倾向于做类似Java的风格的事情,但我更喜欢Kotlin风格的约定。需要成为“Kotlin-y” – poisondminds