2017-12-30 32 views
2

Ich habe definiction der FunktionKotlin Super Kclass

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

und ich brauche TKClass von Typ zu erhalten. Es ist möglich in Kotlin?

+0

Meinten Sie 'dataStore: KotlinEntityDataStore '? Ich verstehe nicht, warum es ein generisches Argument für "Persistable" dann ein explizites "Persistable" Argument gibt –

+0

KotlinEntityDataStore ist nur Parameter des Konstruktors. Ich muss Kclass von T-Parameter bekommen :) – bajky

+0

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? –

Antwort

1

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>() 
Verwandte Themen