Scala错误类型不匹配

时间:2016-01-06 13:30:07

标签: 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
                         ^

我修复它的方法是修改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]
  }
}

1 个答案:

答案 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