あなたの例をその単純な1つのケースを超えて拡張すると、より明白になります。
多重継承:
class C[A] extends X with Y with Z
ミックスイン:
val x = new X with Y
パラメータ化:
class X[A <: B] extends Y[A]
複数の(関連の)タイプのparams:
class X[A >: B, B](x: A, xs: Seq[B])
の
コンテキスト境界:
class X[A : Manifest]
表示範囲:
class X[A <% Ordered[A]]
ジェネリック方法:
class Foo[B] {
def bar[A <: B](x: A) = ...
}
あなたが見ることができるように、typeパラメータで指定される関係クラスを宣言するときに利用できる単純な線形階層よりもはるかに豊富です限界のために低い。
それは、クラスやメソッドのジェネリック型パラメータは非常に多くの場合、あなたが書くことができるように、推論されることは注目にも価値がある:
val myList = List(1, 2, 3)
代わりの
val myList = List[Int](1, 2, 3)
そうで表記方法非常に異なっています。
更新
1つの特定の例は、ちょうど同時に両方の表記を使用することを実証し、彼らは明確なままにする必要があるかを示す、心に春ました:
def someMethod[T <: Foo with Bar](x: T) = ...
これは、その型のparamが必要ですT
は、Foo
とBar
の両方で混在するサブタイプです。
同じ構造タイプで適用されます。
type Closable = { def close: Unit } //alias for a structural type
def someMethod[T <: Closable](x: T) = ...
++クラスと型の違いについては、 –
を参照してください。クラスと型は異なる表記を使用するのが理にかなっています。説明ありがとう。 – sschaef