2017-06-01 110 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 
    } 
} 
相關問題