我正在创建一个包含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)
}
答案 0 :(得分:2)
好吧,传递的输入不等于提供的输入,对吧? print
需要A
:
def print(a: A) = {
并且min
不会返回A
:
val min = new Comparable[A] {
至于如你所愿创建这样的A
......你怎么可能去做呢?你对A
一无所知 - 你不知道它的toString
返回什么,你不知道它实现的方法等等。
所以,基本上,改变你的算法。
答案 1 :(得分:0)
您收到编译错误,因为您尝试使用Comparable,而编译器期望A,您 想要做的是:
val min: A = new A {
def compareTo(other: A) = -1
}
但是你不能在Scala(或Java)中这样做,因为你正在尝试创建一个未知类型的对象(A)。你可以使用反射来做到这一点,但你仍然会遇到创建一个比列表中任何其他对象少的对象的问题。
另外,请注意,您选择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)
}
}
但正如丹尼尔所说,这可能是错误的做法。