9

我试图理解 Scala 的存在类型。

有什么区别:

def foo[X <: Bar] = 3

def foo[_ <: Bar] = 3

还是它们不仅仅是未命名的类型参数?

4

1 回答 1

8

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

更新

回应:“我想不出未使用类型的用例,我将不胜感激”:

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

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在其实现中不需要类型参数,但它必须存在(尽管未命名)以符合它覆盖的方法。

于 2013-01-07T20:18:32.330 回答