开发者

Simple question about Scala generics

What is the difference between X[Any] and X[_] ?

Let's consider, for example, tw开发者_开发技巧o functions below:

def foo(x:X[_]){}
def foo(x:X[Any]){}

What is exactly the difference between these declarations above?


The first is an existential type, and the second is a normal type. The first syntax actually means this:

def foo(x:X[t] forSome { type t }){}

What this means is that x is of type X[t], where t can be any unspecified type t.

Intuitively, X[_] means the type parameter of X is irrelevant, whereas X[Any] says it must be Any.


The difference is in insignificant

scala> class X[T]   
defined class X

scala> def type_of[T](x: X[T])(implicit m: Manifest[T]) = m.toString
type_of: [T](x: X[T])(implicit m: Manifest[T])java.lang.String

scala> val x1: X[Any] = new X
x1: X[Any] = X@1a40cfc

scala> val x2: X[_] = new X  
x2: X[_] = X@29d838

scala> type_of(x1)
res10: java.lang.String = Any

scala> type_of(x2)
res11: java.lang.String = _ <: Any

I can not name a situation, when you can use Any but can not use _ and vice verse.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜