我正在尝试理解Scala的存在类型。
之间有什么区别:
def foo[X <: Bar] = 3
和
def foo[_ <: Bar] = 3
或者它们不只是未命名的类型参数?
答案 0 :(得分:6)
这里_
确实只是一个未命名的类型参数,不多也不少。
def foo[_ <: Bar] = 3
和def 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参数,但它必须在那里(虽然未命名)以符合它重写的方法。