scala Option [Int]原始拳击和拆箱

时间:2018-04-13 05:09:55

标签: scala intellij-idea boxing

您好我有关于拳击和IntelliJ de-sugar菜单的问题。

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

object App {

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

现在当我使用De-sugar菜单时,我得到了这段代码

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]。

2 个答案:

答案 0 :(得分:2)

这是一个错误,已被IntelliJ

接受为错误

Bug ticket

答案 1 :(得分:1)

听起来很奇怪,它可能是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();
        ()
      }
    }
  }
}