scala Option[Int] 原语装箱和拆箱

scala Option[Int] primitive Boxing and Unboxing

您好,我有一个关于拳击和 IntelliJ 脱糖菜单的问题。

因此,当我将一个 Int 例如包装到一个 Scala 选项中时,我希望原语会被装箱一次,但是当我在 IntelliJ 中对 Scala 代码进行去糖处理时,我得到一个值被装箱 5 次或更多次

object App {

  def main(args: Array[String]): Unit = {  
     val a: Option[Int] = Some(1)    
  }
}

现在,当我使用“脱糖”菜单时,我得到了这个代码

object App {
   def main(args: Array[String]): Unit = {
      val a: Option[Int] = Some.apply(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        Predef.Integer2int(scala.runtime.BoxesRunTime.boxToInteger(
        1
        )))))))))))))))))))))

 }
}

其中有很多次原始盒子。现在这似乎会使我的代码膨胀。

为什么它需要将 Option[Int] 装箱那么多次。

听起来很奇怪,会不会是 IntelliJ 的产物?

在命令行中使用 scala 2.12.5 作为:

./scala -Xprint:typer -e "val a: Option[Int] = Some(1)"

它似乎产生了一个调用:

private[this] val a: Option[Int] = scala.Some.apply[Int](1);

完整结果为:

[[syntax trees at end of                     typer]] // scalacmd4175089397487439052.scala
package <empty> {
  object Main extends scala.AnyRef {
    def <init>(): Main.type = {
      Main.super.<init>();
      ()
    };
    def main(args: Array[String]): Unit = {
      final class $anon extends scala.AnyRef {
        def <init>(): <$anon: AnyRef> = {
          $anon.super.<init>();
          ()
        };
        private[this] val a: Option[Int] = scala.Some.apply[Int](1);
        <stable> <accessor> private def a: Option[Int] = $anon.this.a
      };
      {
        new $anon();
        ()
      }
    }
  }
}

这是一个错误,已被 IntelliJ 接受为错误

Bug ticket