scala - 带有可变参数的 scala 中的构造函数

标签 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 发生了什么?

很抱歉用一个新手问题来打扰你

最佳答案

你没有错,但编译器错了。它试图获取 p1p (在您的情况下,它会尝试从 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/

相关文章:

scala - 使用 sbt run 或使用 spark-submit 脚本运行 spark 应用程序的区别

java - Flink 没有向 kafka 提交偏移量

android - 由于某些中间构造函数调用,没有可用的 TYPE 封闭实例

python - **(双星/星号)和*(星号/星号)对参数有什么作用?

c++ - 我在 C++ 中收到 "template argument deduction/substitution failed:"错误

斯卡拉探查器?

c++ - 禁止 C++ 编译器自动提供的功能

java - 在 Java 中创建对象时重载构造函数 VS 传递 null

c++ - 如何停止检查可变参数

scala - 在flakey测试失败之前,如何连续sbt测试?