我试图找到另一种避免类型不匹配错误的方法,这种错误看起来比我现在使用的错误更准确。
分别考虑列表和功能:
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的情况下定义append函数?
试图更清楚,目标是创建下面的课程
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 :(得分:2)
您收到该错误是因为您的类型变量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
。