Type Bounds中的下划线(_)有特殊含义吗?

时间:2013-01-07 19:29:52

标签: scala types existential-type type-bounds

我正在尝试理解Scala的存在类型。

之间有什么区别:

def foo[X <: Bar] = 3

def foo[_ <: Bar] = 3

或者它们不只是未命名的类型参数?

1 个答案:

答案 0 :(得分:6)

这里_确实只是一个未命名的类型参数,不多也不少。 def foo[_ <: Bar] = 3def foo[X <: Bar] = 3之间没有区别X未使用。

<强>更新

回应:&#34;我无法想到一个未使用类型的用例,我很感激一个&#34;:

请注意,这与询问如果不使用参数的目的是什么一样几乎相同,例如:

def foo( x: Int ) = 123

通常一个很好的理由是该方法符合某些其他API中预期的形状。 例如,您希望将方法(或者更确切地说是eta-expansio)传递给另一个需要参数的方法。例如:

scala> List(1,2,3).map(foo)
res0: List[Int] = List(123, 123, 123)

另一种可能性是您的方法是覆盖:

trait A {
  def foo( x: Int ): Int
}

trait B extends A {
  def foo( x: Int ) = 123
}

同样的理性适用于类型参数。以最重要的案例为例:

trait A {
  def foo[X <: Bar]: Int
}

trait B extends A {
  def foo[_<:Bar] = 3
}

B.foo在其实现中不需要type参数,但它必须在那里(虽然未命名)以符合它重写的方法。