8

いくつかの例を見た後、F-Bounded ポリモーフィックがもたらすものを理解できていないと言わざるを得ません。

scala school ( https://twitter.github.io/scala_school/advanced-types.html#fbounded )の例を使用するには

彼らは、サブクラスがサブタイプを返すことができるように、F-Bounded 型が必要であると説明しています。したがって、彼らは次のようにします。

trait Container[A <: Container[A]] extends Ordered[A]
class MyContainer extends Container[MyContainer] {
  def compare(that: MyContainer) = 0
}

しかし、次のようなものを使用できる場合、この種のタイプを使用することの利点はわかりません。

trait Container[A] extends Ordered[A]
class MyContainer extends Container[MyContainer] {
  def compare(other: MyContainer) = 0
}

どんな説明でも大歓迎です

ありがとう

4

2 に答える 2

5

次のような場合に利点があります。

trait Container[A <: Container[A]] extends Ordered[A] {
  def clone: A
  def pair: (A, A) = (clone, clone)
}

class MyContainer extends Container[MyContainer] {
  def clone = new MyContainer
}

これpairで無料で、正しい戻り値の型を取得できます。このようなものがなければ、同じ型を返すすべてのメソッドを手動でオーバーライドする必要があります (多くの無意味なボイラープレート)。そうしないと、オーバーライドされていないメソッドを呼び出すとすぐに型の特異性が失われます。

于 2015-03-30T07:07:47.883 に答える
1

Scala では、型バインドによって型パラメーターを制約することができます。ここで最初のメソッドでは、型パラメーターを作成して、Container のサブクラスで上限を設定しています。

最初のメソッドを使用すると、 Container クラスのサブクラスではない Container クラスにパラメーターを渡すことができません。

2番目の例では、任意のクラスのパラメーター型インスタンスを渡すことができます。したがって、ここでは何も制限していませんが、最初の例では Container クラスのタイプサブタイプを制限しています。

于 2015-03-30T07:48:44.447 に答える