2013-03-09 14 views
13

Se una classe ha un parametro di tipo convariant come Iterable[+A], c'è qualche differenza tra la dichiarazioneComprendere Scala di _ vs Qualsiasi/Niente

def foo(bar: Iterable[_]) 

e

def foo(bar: Iterable[Any]) 

?


Se una classe ha un parametro di tipo controvariante come Growable[-A], c'è qualche differenza tra la dichiarazione

def foo(bar: Growable[_]) 

e

def foo(bar: Growable[Nothing]) 

?

+2

possibile duplicato di [scala - Qualsiasi vs trattino basso in generici] (http://stackoverflow.com/questions/15186520/scala-any-vs-underscore-in-generics) –

+0

Non è un duplicato esatto, ma abbastanza vicino. Lascerò che gli altri giudichino. –

risposta

4

Fa una piccola differenza quando il parametro generico è limitato. Ad esempio, se si ha

class BoundedIterable[+A <: Something] 
class BoundedGrowable[-A >: Something] 

quindi digitare BoundedIterable[Any] e BoundedGrowable[Nothing] sarebbe illegale.

Non so se c'è altra differenza, ma posso dire con certezza che dovresti preferire la variante senza caratteri jolly, ove possibile. Questo perché, in realtà, lo scopo stesso della varianza del tipo di sito di dichiarazione è di eliminare i caratteri jolly (che sono una forma di varianza del sito di utilizzo). Quando dici List[Any] vuoi dire "elenco di qualsiasi cosa", ma quando dici "List[_]" intendi "elenco di non-non-so-cosa". Quindi il primo è solo molto più chiaro, anche se potrebbero essere equivalenti in qualche caso particolare.

+0

Se un parametro di tipo è limitato da 'Something', potremmo semplicemente usare' Something' al posto di 'Any' /' Nothing'. In tal caso, potremmo scrivere 'def foo (bar: MyBoundedType [Something])' (sia per il caso covariante che per quello controvariante). –

+0

@Peter Questo è vero. Ecco perché l'ho chiamato "un po '" differenza :) – ghik