0

オブジェクトを保持するリストを作成していますが、そのメソッドComparableに対して常に -1 を返すように、リストの最小値として機能する 1 つのオブジェクトを作成したいと考えています。compareToここのようなリスト内の他のメソッドには、printタイプ A の入力が必要です。コードをコンパイルすると、次のエラーが発生します。

error: type mismatch;
found   : java.lang.Object with java.lang.Comparable[String]
required: String
l.print(l.min)

リスト内の他のどの要素よりも常に小さくなるように、そのような最小要素を作成する方法について誰でも考えていますか?

class MyList[A <: Comparable[A]] {
  val min = new Comparable[A] {
    def compareTo(other: A) = -1
  }

  def print(a: A) = {
    println(a)
  }
}

class Run extends Application {
  val l = new MyList[String]
  l.print(l.min)
}
4

2 に答える 2

2

渡された入力は、提供された入力と等しくありませんよね? printが必要Aです:

def print(a: A) = {

を返さminないA:

val min = new Comparable[A] {

あなたが望むようなものを作成するAことに関して...どうやってそれを行うことができますか? あなたは何も知りませAん-それが何をtoString返すか、それがどのメソッドを実装するかなどを知りません。

したがって、基本的には、アルゴリズムを変更してください。

于 2010-10-05T20:26:30.583 に答える
0

コンパイラが A を期待している場所で Comparable を使用しようとしているため、コンパイル エラーが発生します。本当にやりたいことは次のとおりです。

  val min: A = new A {
    def compareTo(other: A) = -1
  }

ただし、未知の型 (A) のオブジェクトを作成しようとしているため、Scala (または Java) でこれを行うことはできません。リフレクションを使用してこれを行うこともできますが、リスト内の他のどのオブジェクトよりも小さいオブジェクトを作成するという問題が依然としてあります。

また、compareTo の実装では、選択したほとんどすべての並べ替えアルゴリズムで問題が発生することに注意してください。これは、compareTo が常に min から呼び出されることを保証できないためです。たとえば、次のようになります。

min.compareTo(list(0)) // returns -1
list(0).compareTo(min) // could be anything really

特定のオブジェクトを「最小」として返すリストが必要な場合は、ソートされたリストに特定の値を追加するだけです。

class MyList2[A <: Comparable[A]] {
    val min: A; // somehow create an instance of the class A
    val list: List[A]

    def sort(fn: (A, A) => Boolean) = {
        min :: list.sort(fn)
    }
}

しかし、ダニエルが言うように、これはおそらく間違った方法です。

于 2010-10-06T04:34:40.473 に答える