有时候,你并不关心是否能够命名一个类型变量,例如:
scala> def count[A](l: List[A]) = l.size
count: [A](List[A])Int
这时你可以使用“通配符”取而代之:
scala> def count(l: List[_]) = l.size
count: (List[_])Int
这相当于是下面代码的简写:
scala> def count(l: List[T forSome { type T }]) = l.size
count: (List[T forSome { type T }])Int
注意量化会的结果会变得非常难以理解:
scala> def drop1(l: List[_]) = l.tail
drop1: (List[_])List[Any]
突然,我们失去了类型信息!让我们细化代码看看发生了什么:
scala> def drop1(l: List[T forSome { type T }]) = l.tail
drop1: (List[T forSome { type T }])List[T forSome { type T }]
我们不能使用T因为类型不允许这样做。
你也可以为通配符类型变量应用边界:
scala> def hashcodes(l: Seq[_ <: AnyRef]) = l map (_.hashCode)
hashcodes: (Seq[_ <: AnyRef])Seq[Int]
scala> hashcodes(Seq(1,2,3))
<console>:7: error: type mismatch;
found : Int(1)
required: AnyRef
Note: primitive types are not implicitly converted to AnyRef.
You can safely force boxing by casting x.asInstanceOf[AnyRef].
hashcodes(Seq(1,2,3))
^
scala> hashcodes(Seq("one", "two", "three"))
res1: Seq[Int] = List(110182, 115276, 110339486)