簡體   English   中英

Scala匿名類類型不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM