0

この問題の解決策が明白すぎる場合、または以前にこのフォーラムで既に解決されている場合はご容赦ください (その場合は、その投稿を教えてください)。

クラスがあります

org.personal.exercises.LengthContentsPair (l: Int, c: String) 
{
    val length = l
    val contents = c

}

次に、同じソース ファイルで、この型のオブジェクトを順序付けする方法を定義する暗黙の値も定義します。

object LengthContentsPair  {

    implicit val lengthContentsPairOrdering = new Ordering [LengthContentsPair] {

       def compare (a: LengthContentsPair, b: LengthContentsPair)= {
   
          a.length compare b.length;
       }
    }
 }

このフォーラムで提供されている次の解決策。

ここで、セット内の要素の数を特定の数に制限する特殊なセットを作成したいと考えています。したがって、次のような別のクラスを定義します。

import scala.collection.immutable.TreeSet;

import org.personal.exercises.LengthContentsPair.lengthContentsPairOrdering;

class FixedSizedSortedSet [LengthContentsPair]  extends TreeSet [LengthContentsPair]  
{ .. 
}

私には、これが TreeSet をサブクラス化する正しい方法のように思えます。ただし、コンパイラは次のエラーをスローします。

(1) LengthContentsPair に暗黙の Ordering が定義されていません。

(2) コンストラクター TreeSet の引数が不十分: (暗黙の順序付け: Ordering[LengthContentsPair])scala.collection.immutable.TreeSet[LengthContentsPair]。値パラメーターの順序が指定されていません。

スコープ規則を間違って理解していませんか? とても簡単に感じますが、手がつけられません。

4

1 に答える 1

1

あなたはFixedSizedSortedSet間違って定義しました。実装にはLengthContentsPair、その名前のクラスとは関係のないという名前のジェネリック型パラメーターがあります。つまり、LengthContentsPairジェネリック型のシャドウクラスがあります。

の要素のみを保持する特殊なセットが必要な場合はLengthContentsPair、おそらく次のことを意味します。

class FixedSizedSortedSet extends TreeSet[LengthContentsPair]  
{ .. 
}

これは、のインスタンスOrdering[LengthContentsPair]が表示されている場合に機能するはずです。LengthContentsPairただし、順序はのコンパニオンオブジェクトで定義され、デフォルトでは暗黙的なパラメータとして表示されるため、これは問題にはなりません。

TreeSetしかし、任意のタイプの要素を保持できる汎用拡張が必要な​​場合は、おそらくこれを意味します。

class FixedSizedSortedSet[T](implicit ordering: Ordering[T]) extends TreeSet[T]  
{ .. 
}

暗黙的パラメータが必要なためTreeSet、暗黙的パラメータが必要ですOrdering[T]。そのため、その要件をに転送する必要があります。FixedSizedSortedSet

ところで。LengthContentsPairクラスをケースクラスに置き換えることを検討することをお勧めします。

于 2013-01-24T13:57:04.083 に答える