斯卡拉 一个字段的case类可以是值类吗?
发布时间:2020-12-16 09:35:27 所属栏目:安全 来源:网络整理
导读:Scala 2.10引入了 value classes.它们非常适用于编写类型安全代码。此外,还有一些限制,其中一些将由编译器检测到,有些将需要在运行时分配。 我想使用案例类语法创建值类,以允许创建无新语法和人性化的toString。没有模式匹配,因此需要分配。 所以问题是
Scala 2.10引入了
value classes.它们非常适用于编写类型安全代码。此外,还有一些限制,其中一些将由编译器检测到,有些将需要在运行时分配。
我想使用案例类语法创建值类,以允许创建无新语法和人性化的toString。没有模式匹配,因此需要分配。 所以问题是:将使用case类语法需要value类分配? 解决方法
你可以有一个case类,它是一个值类。从下面的示例可以看出,没有对象创建。除了当然不可避免的拳击,如果你会上演任何。
这是一小堆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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |