我试图理解 Scala 的存在类型。
有什么区别:
def foo[X <: Bar] = 3
和
def foo[_ <: Bar] = 3
还是它们不仅仅是未命名的类型参数?
我试图理解 Scala 的存在类型。
有什么区别:
def foo[X <: Bar] = 3
和
def foo[_ <: Bar] = 3
还是它们不仅仅是未命名的类型参数?
这里_
确实只是一个未命名的类型参数,不多也不少。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
在其实现中不需要类型参数,但它必须存在(尽管未命名)以符合它覆盖的方法。