2014-10-23 17 views
16

Wie ist es möglich, einen generischen Typ für eine Methode in Kotlin zu erzwingen? ich zum Beispiel wissen, können Sie wie folgt vorgehen:Kotlin Generika

var someVar: MutableSet<out SomeType> = hashSetOf() 

Wie kann man für ein Verfahren das gleiche tun?

fun <T> doSomething() { 
} 

würde Ich mag T zu erzwingen sein vom Typ X oder einem Untertyp davon.

Danke.

Antwort

22

Nach googeln um, wäre die richtige Antwort sein:

fun <T : X> doSomething() { 
} 
+4

http://kotlinlang.org/docs/reference/generics.html#upper-bounds – bashor

4

Eigentlich bedeutet out SomeType mehr als als Ihre Fragen schlägt vor, „Typ Parameter Sometype oder einer seiner Subtypen sein kann“.

Das Schlüsselwort out Kotlin Weg ist zu sagen, dass in diesem Beispiel ist die MutableSet ein Producer von SomeType, das heißt es ist covariant in seiner Art Parametern. Daher können Sie keine Methoden wie add(t:T) aufrufen, sondern nur solche, die T s zurückgeben, wie get():T.

Zurück zu Ihrer Frage: Wenn Ihre Methode sollen Arten X oder seine Subtypen akzeptieren, sollten Sie „Grenzen“ verwenden:

fun <T : X> doSomething() { 
} 

Das ist genau das, was man braucht, aber es wieder klar zu machen, Es kann nicht gesagt werden, dass es dem anderen Beispiel entspricht.

2

als @ s1m0nw1 zitiert, Sie fun <T : X> doSomething() { }

können T-Subtyp von X,

zusätzlich zu begrenzen, Sie fun <T> doSomething where T : Comparable, T : Cloneable { }

begrenzen können T sowohl Comparable und Cloneable

implementieren sollten

wie hier angegeben https://kotlinlang.org/docs/reference/generics.html