2014-10-23 14 views
16

Come è possibile applicare un tipo generico per un metodo in Kotlin? So per esempio, è possibile effettuare le seguenti operazioni:Generic di Kotlin

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

Come si può fare lo stesso per un metodo?

fun <T> doSomething() { 
} 

mi piacerebbe far rispettare T essere di tipo X o un sottotipo di esso.

Grazie.

risposta

22

Dopo googling intorno, la risposta corretta sarebbe:

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

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

4

realtà out SomeType significa più di "tipo parametro può essere SomeType o uno qualsiasi dei suoi sottotipi" come suggerisce domande.

La parola out è il modo di Kotlin dire che, in questo esempio, il MutableSet è un Produttore di SomeType, cioè esso è covariante nel suo parametro di tipo. Di conseguenza, non sarà possibile chiamare metodi come add(t:T), ma solo quelli che restituiscono T s, come get():T.

Torna alla tua domanda: se si suppone che il metodo di accettare tipi di X o dei suoi sottotipi, si dovrebbe usare "limiti":

fun <T : X> doSomething() { 
} 

Questo è proprio quello che serve, ma per rendere ancora una volta in chiaro , non si può dire che sia l'equivalente del tuo altro esempio.

2

come @ s1m0nw1 citato, è possibile utilizzare fun <T : X> doSomething() { }

per limitare T sottotipo di X,

aggiuntivo, è possibile utilizzare fun <T> doSomething where T : Comparable, T : Cloneable { }

per limitare T dovrebbe implementare sia Comparable e Cloneable

come indicato di seguito https://kotlinlang.org/docs/reference/generics.html