2017-05-20 6 views
2

Gibt es in Kotlin eine Möglichkeit, eine generische Eigenschaft zu erstellen ohne eine generische Klasse auf Klassenebene deklarieren? Etwas, das wie folgt aussieht:Kotlin Generische Eigenschaft

interface Generic { 
    val t: T //I need this type only once, thats why I dont wanna pass in the class level 

    fun <E> gMethod(e: E) { //This works, so I'm wondering if there's something similiar to properties 

    } 
} 

Antwort

3

Nein, wie sollte der Compiler wissen, was T ist? Wenn Sie den generischen Typparameter T trotzdem nicht benötigen, können Sie ihn einfach als val t: Any deklarieren.

2

Da die documentation about generics keine solche Sache erwähnt, bin ich mir ziemlich sicher, dass dies kein Teil der Sprache ist.

Dies ist höchstwahrscheinlich, weil Sie den Typ der Eigenschaft bei einige Punkt deklarieren müssen. Generische Funktionen sind sinnvoll, weil Sie sie mit Argumenten aufrufen, die eine Art statischen Typ haben (oder im Fall von Erweiterungsfunktionen, rufen Sie sie auf solche Argumente).

Die Frage ist, warum möchten Sie eine generische Eigenschaft wie diese haben?

Was würden Sie erwarten, dass diese Eigenschaft als Wert akzeptiert wird, wenn Sie versuchen, sie festzulegen? Wenn die Antwort irgendetwas ist, sollte der Typ Any oder Any? sein.

Das gleiche gilt für das Lesen - welchen Typ würden Sie erwarten, dass der Wert, den Sie von dieser Eigenschaft lesen, hätte? Wenn Sie überhaupt keinen Typ angeben möchten, sollte es wahrscheinlich Any oder Any? sein.

Die Lösung, die tatsächlich in der Sprache ist, die die Klasse/Schnittstelle einen Typparameter hat, löst diese Probleme.

0

Ich bin ein kompletter Neuling nach Kotlin, aber eine generische Eigenschaft ist nicht wirklich etwas falsch, oder?

Was ist das als ein Schaufenster. Ich verstehe, dass diese Lösung Ihre Frage nicht vollständig behandelt.

interface BaseProperty<T> { 
    var value: T 
} 


class IntProperty(var stringVal: String) : BaseProperty<Int?> { 
    override var value: Int? 
    get() = Integer.valueOf(stringVal) 
    set(v: Int?) { 
     stringVal = v.toString() 
    } 
} 

Da die Getter und Setter der Eigenschaft gibt auch Funktionen, wäre es schön gewesen wäre, wenn ich in der Lage waren T als Gattungstyp angeben. Ich habe versucht, getValue und setValue als generische Funktionen zu verwenden, und das scheint zu funktionieren, aber nicht das Kotlin-Eigenschaft-Idiom zu verwenden.

Verwandte Themen