scala中的构造函数与varargs

时间:2013-04-30 07:48:58

标签: scala constructor variadic-functions

我是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发生了什么?

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

3 个答案:

答案 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并在其上面找到答案,我认为应该回答您的问题; - )