繁体   English   中英

Scala错误类型不匹配

[英]Scala error type mismatch

我正在尝试寻找另一种避免类型不匹配错误的方法,该错误看上去比我现在正在使用的更正确。

分别考虑列表和功能:

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的情况下定义附加函数?

为了更加清晰,目标是在下面创建类

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

Cstruct的构建方式应可以定义扩展Cstruct的新类,但对值T使用不同的数据结构。就像Cseq使用任何类型的元素的List一样,但应可以使用以下方式创建类似的类:集合或地图。

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

因为类型变量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]中, Uoverride def append[U]是不是在定义的不同类型的参数class Cseq[U] 它恰好具有相同的名称U

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM