我正试图找到另一种避免类型不匹配错误的方法,它看起来比我现在正在使用的错误更正确 .
分别考虑列表和功能:
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一样,但应该可以创建类似的元素集合或 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]
}
}
1 回答
您得到该错误,因为您的类型变量
U
没有约束,它可以是任何类型 - 但您尝试将U
类型的值添加到Int
列表中 .您的修复程序不是类型安全的 . 它允许您尝试将
String
添加到List[Int]
.asInstanceOf
使编译错误消失,但如果向列表中添加错误类型的对象,则会在运行时获得ClassCastException
.为什么你的方法有一个类型参数?如果列表始终是
List[Int]
,那么它应该只需Int
而不是U
:编辑 - 你可以这样做:
请注意,在您自己的
Cseq[U]
定义中,override def append[U]
中的U
是与class Cseq[U]
中定义的类型参数不同的类型参数 . 它碰巧具有相同的名称U
.