0

我正在创建一个包含对象的列表Comparable,并希望创建一个作为列表最小值的对象,以便它始终为其compareTo方法返回 -1。列表中的其他方法,例如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
  }

但是你不能在 Scala(或 Java)中这样做,因为你试图创建一个未知类型的对象(A)。您可以使用反射来做到这一点,但您仍然会遇到创建一个小于列表中任何其他对象的对象的问题。

另外,请注意您的 compareTo 实现几乎会遇到您选择的任何排序算法的问题,因为您不能保证始终从 min 调用 compareTo。例如,您可以获得:

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 回答