scala - 斯卡拉(Scala)。具有一个字段的案例类可以是值类吗?

标签 scala scala-2.10

Scala 2.10引入了value classes。它们对于编写类型安全代码非常有用。此外,还有一些限制,其中一些将被编译器检测到,而某些则需要在运行时分配。

我想使用case class语法创建值类,以允许创建-没有新语法和对人类友好的toString。没有模式匹配,因为它需要分配。

所以问题是:使用case class语法是否需要分配值类?

最佳答案

您可以具有作为值类的案例类。从下面的示例中可以看到,没有对象创建。当然,除了不可避免的拳击比赛之外,如果您会选择“任意”。

这是一小段scala代码

class ValueClass(val value:Int) extends AnyVal

case class ValueCaseClass(value:Int) extends AnyVal

class ValueClassTest {

  var x: ValueClass = new ValueClass(1)

  var y: ValueCaseClass = ValueCaseClass(2)

  def m1(x:ValueClass) = x.value

  def m2(x:ValueCaseClass) = x.value
}

还有字节码,它不包含两个值类的丝毫痕迹。
Compiled from "ValueClassTest.scala"
public class ValueClassTest {
  public int x();
    Code:
       0: aload_0       
       1: getfield      #14                 // Field x:I
       4: ireturn       

  public void x_$eq(int);
    Code:
       0: aload_0       
       1: iload_1       
       2: putfield      #14                 // Field x:I
       5: return        

  public int y();
    Code:
       0: aload_0       
       1: getfield      #21                 // Field y:I
       4: ireturn       

  public void y_$eq(int);
    Code:
       0: aload_0       
       1: iload_1       
       2: putfield      #21                 // Field y:I
       5: return        

  public int m1(int);
    Code:
       0: iload_1       
       1: ireturn       

  public int m2(int);
    Code:
       0: iload_1       
       1: ireturn       

  public rklaehn.ValueClassTest();
    Code:
       0: aload_0       
       1: invokespecial #29                 // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: iconst_1      
       6: putfield      #14                 // Field x:I
       9: aload_0       
      10: iconst_2      
      11: putfield      #21                 // Field y:I
      14: return        
}

关于scala - 斯卡拉(Scala)。具有一个字段的案例类可以是值类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17658301/

相关文章:

scala - 如何解决 `/packages cannot be represented as URI` 问题?

scala - Spark : GenericMutableRow cannot be cast to java. lang.Byte 和 <none> 不是一个术语

Scala:下划线的另一种用法?

scala - 使用 Global.Run 编译 Scala 代码时出现 MissingRequirementError

scala - 可以在变量名后插入带有字母数字的字符串吗?

scala - 使用 Scala 2.10 更新到 Eclipse Juno 后,多维数组声明失败

list - 我如何在 Scala 中得到两个列表的平方和?

scala - 从Scala读取Parquet文件而不使用Spark

Scala - Seq 的大小和长度有什么区别?

performance - 在哪种情况下,Scala 2.10.0 编译器可以比 2.9.2 更快或更慢?