2

私は何かをしたい

class Pack extends collection.immutable.List[Dog]{
  def pullSled() = //...
}

しかし、Scala コンパイラーは教えてくれます

illegal inheritance from sealed class List

これはJavaで行うのは簡単ですが、何か重要なものが欠けていると思います.

動機:

すべての基本クラスのメソッドを使用できるようにしたい

(new Pack()).contains(snoopy)

直接またはミックスインで拡張できるようにしたい

new Pack() with Driver

基になるコレクション タイプを簡単に変更できるようにしたい (たとえば、セットに切り替えるため)

ありがとう!

4

1 に答える 1

6

List[T]最終的なものであるため、そこから拡張することはできません (以下の理由を参照してください)。に追加のメソッドが必要なだけの場合List[Dog]は、おそらくそれをポン引きするのが最も簡単です。

implicit class Pack(l: List[Dog]) {
  def pullSled() = //...
}

Packが範囲内にある場合、次のように動作します。

val a = List(new Dog)
a.pullSled()

独自の犬のコレクションを本当に作成する必要がある場合は、こちらをご覧ください: http://www.scala-lang.org/docu/files/collections-api/collections-impl.html

List[T]次の理由により、拡張できません:Pack希望どおりに持っているとします。次は機能しますが、実際には必要なものが得られません。

val pack: Pack = ...

val pack2 = new Dog :: pack

// pack2: List[Dog], not a Pack... :(

LinearSeq上のリンクで説明されているように適切に拡張すると、これが軽減されます。

于 2013-04-30T00:11:14.977 に答える