[英]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]
中, U
在override def append[U]
是不是在定義的不同類型的參數class Cseq[U]
它恰好具有相同的名稱U
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.