scala中带varargs的构造函数

scala中带varargs的构造函数,scala,constructor,variadic-functions,Scala,Constructor,Variadic Functions,我是Scala的新手。我仔细阅读了几本书,并阅读了一些在线教程。我的第一个项目有问题,所以我将代码简化为可能出错的最简单的代码 我在google和stack overflow中搜索了scala/constructor/varargs,并阅读了几篇scala教程 (几乎)最简单的代码是: class Foo(val params: Int*) case class Foo1(val p: Int) extends Foo(p) case class Foo2(val p1: Int, val p2

我是Scala的新手。我仔细阅读了几本书,并阅读了一些在线教程。我的第一个项目有问题,所以我将代码简化为可能出错的最简单的代码

我在google和stack overflow中搜索了scala/constructor/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怎么了


很抱歉,我用一个新手问题来打扰您,我无法向您解释/为什么/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) )
}

还要注意的是,在扩展
应用程序时,您不希望覆盖
主应用程序
,您应该浏览一下它上面的答案,我认为它应该回答您的问题;-)

您没有错,但编译器错了。它尝试从
p
中获取
p1
(在您的情况下,它将尝试从
Foo.params
中获取
Foo2.p1
):

这显然是一个错误,因为它无法工作。相反,它应该在子类的ctor中指定
p1


我报告了一个错误:。

我很感谢你对应用程序的评论。我是个新手,所以我只是在Eclipse中使用了Hello World示例。谢谢你的工作代码。我有一些使用列表的方法也很有效:我的问题是理解。不幸的是,我非常担心代码的“可读性”,变量params的目的是保存所有参数。我想知道这是否是scala错误在阅读了您的评论之后,我想我应该提到,上面的代码也改变了示例的语义,因为
Foo
的构造函数现在至少需要一个参数。可能没什么大不了的,但这取决于问题的领域:)谢谢你的回复。我在发布问题之前看到了这一点,但我认为这不是正确的答案。在这个问题中,这个人希望将Any*参数传递给构造函数。我不想那样做。在Foo2的情况下,我将(p1,p2)传递给Any*,出于某种奇怪的原因,它失去了对变量p1的访问,并用获取参数的调用替换它,然后进行类转换。请注意,在这个问题中,用户无法获得要编译的代码。我的编译和运行。我的第一个Scala bug。好的,谢谢。我有工作要做,但我很感激你的帮助。这让我想起了Fortran等价块或Pascal变量记录。顺便说一句,
classX(val p:Int*)
没有多大意义。如果要在构造X之后访问
p
,只需使用序列而不是varargs:
classX(val p:Seq[Int])
classX(p:Int*){def参数:Seq[Int]=p}
def p1(): Int = scala.Int.unbox(Main$$anon$1$B.super.p());