[英]Scala anonymous class type mismatch
我正在創建一個保存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)
}
好吧,傳遞的輸入不等於提供的輸入,對嗎? print
需要一個A
:
def print(a: A) = {
而min
不返回A
:
val min = new Comparable[A] {
至於創建自己想要的A
...您怎么可能去做呢? 您對A
一無所知-您不知道它的toString
返回什么,也不知道它實現了什么方法,等等。
因此,基本上,改變您的算法。
之所以會出現編譯錯誤,是因為您嘗試在編譯器期望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)
}
}
但是正如丹尼爾所說,這可能是錯誤的解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.