首页 文章

Scala错误类型不匹配

提问于
浏览
0

我正试图找到另一种避免类型不匹配错误的方法,它看起来比我现在正在使用的错误更正确 .

分别考虑列表和功能:

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

  • 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] 定义中, override def append[U] 中的 U 是与 class Cseq[U] 中定义的类型参数不同的类型参数 . 它碰巧具有相同的名称 U .

相关问题