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
更新:
「未使用のタイプのユースケースが思い浮かびません。1つあればありがたいです」への対応:
これは、次のように、引数が使用されていない場合に引数を持つ目的は何かを尋ねるのとほとんど同じであることに注意してください。
def foo( x: Int ) = 123
通常、これの正当な理由は、メソッドが他の API で期待される形状に準拠していることです。たとえば、メソッド (またはその eta-expanio) を、パラメーターを必要とする別のメソッドに渡したいとします。例:
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
実装に型パラメーターは必要ありませんが、オーバーライドしているメソッドに準拠するために (名前はありませんが) そこにある必要があります。