我是 Scala 新手。我翻阅了几本书,并阅读了一些在线教程。我的第一个项目有问题,所以我将代码简化为最简单的可能出错的事情。
我已经在谷歌和堆栈溢出中搜索了 scala/constructors/varargs,并阅读了一些 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 时发生异常,并且是
线程“main”中的异常 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 发生了什么?
很抱歉用一个新手问题来打扰你
最佳答案
你没有错,但编译器错了。它试图获取 p1
出p
(在您的情况下,它会尝试从 Foo2.p1
中取出 Foo.params
):
def p1(): Int = scala.Int.unbox(Main$$anon$1$B.super.p());
这显然是一个错误,因为它无法工作。相反,它应该分配
p1
在子类的ctor中。我报告了一个错误:SI-7436 .
关于scala - 带有可变参数的 scala 中的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16294822/