我是Scala的新手。我翻阅了几本书,并阅读了一些在线教程。我的第一个项目遇到了问题,所以我已经将代码简化为可能出错的最简单的东西。scala中的构造函数,带可变参数
我搜索谷歌和堆栈溢出为斯卡拉/构造函数/可变参数,并阅读了一些斯卡拉之旅。
的(几乎)最简单的代码是:
class Foo(val params: Int*)
case class Foo1(val p: Int) extends Foo(p)
case class Foo2(val p1: Int, val p2: Int) extends Foo(p1, p2)
object Demo extends App {
override def main(args: Array[String]) {
val f = Foo2(1, 2)
f.p1
}
}
的异常发生存取时p1和是
异常在线程 “主要” java.lang.ClassCastException:scala.collection.mutable.WrappedArray $ ofInt不能转换为java.lang.Integer中
使用eclipse诉诸调试,我发现一个有趣的特性:当变量寻找
f Foo2 (id=23)
p2 2
params WrappedArray$ofInt (id=33)
array (id=81)
[0] 1
[1] 2
那么p1发生了什么?
我让您费心了一个新手的问题,对不起
Woot。我的第一个Scala bug。好,谢谢。我有一个解决办法,但我很感激帮助。这让我想起了Fortran等价块或Pascal变体记录。 – 2013-04-30 12:18:16
顺便说一下,'class X(val p:Int *)'没有多大意义。如果你想在构造X之后访问'p',只需使用一个序列来代替可变参数:'class X(val p:Seq [Int])'或者class X(p:Int *){def params: Seq [Int] = p}'。 – sschaef 2013-04-30 12:22:47