2017-12-30 54 views
2

は、私は、関数のdefinictionKotlinスーパーKclass

abstract class AbstractDao<T>(private val dataStore: KotlinEntityDataStore<Persistable>): Dao<T> where T: Persistable 

を持っていると私はタイプTからKClassを取得する必要があります。コトリンでは可能ですか?

+0

「データストア:KotlinEntityDataStore 」を意味しましたか?私は、なぜPersistableのためのジェネリック型引数があり、次に明示的なPersistableの引数があるのか​​理解していません。 –

+0

KotlinEntityDataStore は、コンストラクタのパラメータです。私はTパラメータからKclassを得る必要があります:) – bajky

+0

いいえ、 'T 'のヌル以外のインスタンスを参照することができない限り、JVMタイプの消去のために、クラス署名だけではできません。この問題を回避するには、コンストラクタをprivateにして、 'AbstractDao 'のインスタンスを返す 'T'引数でインライン関数(コンパニオンオブジェクト内に)を配置します。それは理にかなっていますか? –

答えて

1

これはtype erasureのためにできません。しかしreified typeというファクトリメソッドを用意して、KClassを受け入れるコンストラクタに委譲することもできます。ここでは簡単な例です:

class WithReifiedType<T> constructor(val kc: KClass<*>) { 
    companion object { 
     inline fun <reified T> getInstance(): WithReifiedType<T> { 
      println("Here's your KClass: ${T::class}") 
      return WithReifiedType(T::class) 
     } 
    } 
} 

//called like this 
WithReifiedType.getInstance<String>() 

それは、発信者のサイト上でのコンストラクタのように見える(コンパニオン包埋工場の代替として)トップレベルの関数を作成しても良いです。

inline fun <reified T> WithReifiedType(): WithReifiedType<T> { 
    println("Here's your KClass: ${T::class}") 
    return WithReifiedType(T::class) 
} 

//called like this 
WithReifiedType<String>()