簡體   English   中英

Scala錯誤類型不匹配

[英]Scala error type mismatch

我正在嘗試尋找另一種避免類型不匹配錯誤的方法,該錯誤看上去比我現在正在使用的更正確。

分別考慮列表和功能:

var l = List[Int]()

def append[U](cmd: U) = {
        l = l :+ cmd
}

解釋上面的代碼時,出現以下錯誤:

<console>:10: error: type mismatch;
 found   : List[Any]
 required: List[Int]
                   l = l :+ cmd
                         ^

我修復它的方法是通過修改append函數使其工作如下:

  def append[U](cmd: U) = {
    l = (l :+ cmd).asInstanceOf[List[Int]]
  }

有沒有一種方法可以在不使用asInstanceOf的情況下定義附加函數?

為了更加清晰,目標是在下面創建類

abstract class Cstruct{
  type T
  var value: T
  def append[U](value:U)
}

Cstruct的構建方式應可以定義擴展Cstruct的新類,但對值T使用不同的數據結構。就像Cseq使用任何類型的元素的List一樣,但應可以使用以下方式創建類似的類:集合或地圖。

class Cseq[U] (v: U) extends Cstruct{
  type T = List[U]
  var value: T = List[U](v)
  override def append[U](cmd: U) = {
    value = (value :+ cmd).asInstanceOf[T]
  }
}

因為類型變量U沒有約束,所以可能會出現任何錯誤,但您嘗試將類型U的值添加到Int列表中,因此會出現此錯誤。

您的修復程序不是類型安全的。 例如,它將允許您嘗試將String添加到List[Int] asInstanceOf可以使編譯錯誤消失,但是如果將錯誤類型的對象添加到列表中,則會在運行時得到ClassCastException

為什么您的方法根本沒有類型參數? 如果列表始終是List[Int] ,則應僅使用Int而不是U

def append(cmd: Int) = {
  l = l :+ cmd
}

編輯 -您可以執行以下操作:

abstract class Cstruct[U] {
  type T
  var value: T
  def append(value: U)
}

class Cseq[U](v: U) extends Cstruct[U] {
  type T = List[U]
  var value: T = List[U](v)

  override def append(cmd: U) =
    value = value :+ cmd
}

請注意,在你自己定義Cseq[U]中, Uoverride def append[U]是不是在定義的不同類型的參數class Cseq[U] 它恰好具有相同的名稱U

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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