これは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>()
「データストア:KotlinEntityDataStore」を意味しましたか?私は、なぜPersistableのためのジェネリック型引数があり、次に明示的なPersistableの引数があるのか理解していません。 –
KotlinEntityDataStoreは、コンストラクタのパラメータです。私はTパラメータからKclassを得る必要があります:) –
bajky
いいえ、 'T 'のヌル以外のインスタンスを参照することができない限り、JVMタイプの消去のために、クラス署名だけではできません。この問題を回避するには、コンストラクタをprivateにして、 'AbstractDao'のインスタンスを返す 'T'引数でインライン関数(コンパニオンオブジェクト内に)を配置します。それは理にかなっていますか? –