我是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发生了什么?
我很抱歉用新手问题困扰你
答案 0 :(得分:6)
你没错,但编译器是。它会尝试从p1
中获取p
(在您的情况下,它会尝试从Foo2.p1
中获取Foo.params
):
def p1(): Int = scala.Int.unbox(Main$$anon$1$B.super.p());
这显然是一个错误,因为它无法正常工作。相反,它应该在子类的ctor中分配p1
。
我报告了一个错误:SI-7436。
答案 1 :(得分:1)
我无法向你解释/为什么/ Scala感到困惑,但以下工作:
class Foo(p: Int, ps: Int*)
case class Foo1(p1: Int) extends Foo(p1)
case class Foo2(p1: Int, p2: Int) extends Foo(p1, p2)
object Main extends App {
println( Foo1(1) )
println( Foo2(2, 3) )
}
另请注意,在展开App
时,您不希望覆盖main
。
答案 2 :(得分:0)
您应该只看一眼this comment并在其上面找到答案,我认为应该回答您的问题; - )