2017-06-01 111 views
0

我想弄清楚是否有可能。一般情况下,我想要做的是从超类的同伴对象中获取类类型的子类的......在下面的剪断,对待__因为我需要什么是否可以从超类中获取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

任何帮助将非常感激!

回答

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风格实用功能的扩展功能。

+0

我喜欢它!非常感谢。我是Kotlin的新手,但擅长Java,所以我倾向于做类似Java的风格的事情,但我更喜欢Kotlin风格的约定。需要成为“Kotlin-y” – poisondminds

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 
    } 
} 
相关问题