scala中的构造函数与varargs

Sta*_*ura 6 constructor scala variadic-functions

我是斯卡拉新手.我已经浏览了几本书,并阅读了一些在线教程.我的第一个项目遇到了问题,因此我将代码简化为最简单的问题.

我搜索了谷歌和堆栈溢出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
  }
}
Run Code Online (Sandbox Code Playgroud)

访问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   
Run Code Online (Sandbox Code Playgroud)

那么p1发生了什么?

我很抱歉用新手问题困扰你

kir*_*uku 6

你没错,但编译器是.它试图p1摆脱p(在你的情况下它会试图Foo2.p1摆脱Foo.params):

def p1(): Int = scala.Int.unbox(Main$$anon$1$B.super.p());
Run Code Online (Sandbox Code Playgroud)

这显然是一个错误,因为它无法正常工作.相反,它应该p1在子类的ctor中分配.

我报告了一个错误:SI-7436.