scala - 为什么 scalac 盒子是 Int?

标签 scala int

我写了以下非常简单的测试:

import scala.collection.immutable.HashSet

class Test {
  def m() = {
    var s = new HashSet[Int]
    s = s + 1
  }
}

并发现它编译为以下代码:
public class Test {
  public void m();
    Code:
       0: new           #12                 // class scala/collection/immutable/HashSet
       3: dup
       4: invokespecial #15                 // Method scala/collection/immutable/HashSet."<init>":()V
       7: astore_1
       8: aload_1
       9: iconst_1
      10: invokestatic  #21                 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
      13: invokevirtual #25                 // Method scala/collection/immutable/HashSet.$plus:(Ljava/lang/Object;)Lscala/collection/immutable/HashSet;
      16: astore_1
      17: return

  public Test();
    Code:
       0: aload_0
       1: invokespecial #30                 // Method java/lang/Object."<init>":()V
       4: return
}

如您所见,1在创建具有 1 个元素的新不可变集之前被装箱。为什么是盒装。 Int extends AnyVal ,不是 AnyRef .

最佳答案

没错,Int extends AnyVal ,不是 AnyRef .但是不变的 HashSet[A] A作为参数,它不是 specialized for primitive types ,即不是@specialized(Int) A或类似的东西,所以它只能处理扩展 AnyRef 的引用类型。 ,原始类型必须装箱。幸运的是,这被 Scala 编译器隐藏了。

关于scala - 为什么 scalac 盒子是 Int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50333479/

相关文章:

python - % : 'NoneType' and 'int' 不支持的操作数类型

python mysql中将订单号输入到表id中

scala - 无法通过 service-locator-dns 库使用基于非 lagom 的静态项目服务

json - 使用 sprayJSON (scala) 将字段添加到现有的 JSON 对象

map 内的Scala Spark过滤器

将数组中存储的 char 类型转换为 int 变量

java - 如何定义方法返回 this 的结构类型

scala - Scala- block 不能包含声明

c - 如何从 C/txt 中的 TXT 文件转换二进制文件(仅包括 int/)

java - 关于CodeChef上的 "Uncle Johnny"问题_