Dies kann aufgrund type erasure nicht durchgeführt werden. Sie können jedoch eine Factory-Methode mit reified type
angeben, die an einen Konstruktor delegiert, der die KClass
akzeptiert. Hier ist ein vereinfachtes Beispiel:
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>()
Es ist auch akzeptabel, eine Top-Level-Funktion (als Alternative zum Begleiter-embedded Fabrik) zu erstellen, wie ein Konstruktor auf der Anrufer-Website suchen.
inline fun <reified T> WithReifiedType(): WithReifiedType<T> {
println("Here's your KClass: ${T::class}")
return WithReifiedType(T::class)
}
//called like this
WithReifiedType<String>()
Meinten Sie 'dataStore: KotlinEntityDataStore'? Ich verstehe nicht, warum es ein generisches Argument für "Persistable" dann ein explizites "Persistable" Argument gibt –
KotlinEntityDataStore ist nur Parameter des Konstruktors. Ich muss Kclass von T-Parameter bekommen :) –
bajky
Nein, wegen der JVM Art Löschung, es sei denn, Sie können eine Nicht-Null-Instanz von 'T' referenzieren, ist es unmöglich, nur von der Klassensignatur zu tun. Eine Option ist, den Konstruktor privat zu machen und eine Inline-Funktion (im Companion-Objekt) mit einem verdinglichten 'T'-Argument zu versehen, das eine Instanz von 'AbstractDao' zurückgibt. Ist das sinnvoll? –