2016-01-06 143 views
0

我試圖找到另一種避免類型不匹配錯誤的方式,它看起來比我現在使用的錯誤類型更正確。Scala錯誤類型不匹配

考慮到列表和功能,分別爲:

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 
         ^

我固定它,方式是通過修改附加功能的工作是這樣的:

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

有沒有一種定義應用程序的方法end函數不使用asInstanceOf?

試圖更清晰,目標是創建下面的類

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

Cstruct應建的方式,將有可能限定延伸Cstruct新的類,但使用不同的數據結構的價值T.與使用任何類型元素的List的Cseq類似,但應該可以使用Set或Map創建類似的元素。

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] 
    } 
} 
+0

爲什麼'append'通用?你只能將'Int's(或超類型)附加到'List [Int]' – Lee

回答

2

你得到這個錯誤,因爲你的類型變量U沒有限制,可以是任何類型 - 但你嘗試U類型的值增加的Int列表。

您的修補程序不是類型安全的。它將允許您嘗試添加例如StringList[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]override def append[U]中的U是與在class Cseq[U]處定義的參數不同的類型參數。它恰好有相同的名字U

+0

它不總是List [Int],List [Int]作爲例子,append方法有一個類型參數因爲它必須是通用的。 – TFR

+0

@TFR看我的編輯。這對你有用嗎? – Jesper

+0

謝謝,那就是我正在尋找的。 – TFR