java - 如何使用默认值初始化值类型?

在java的Project Valhalla上下文中,如何使用默认值对value type进行一般初始化?
最初,我认为将null分配给任何值类型都将执行此初始化。然而,对this question的回答和评论清楚地表明null是一个引用,因此它与值类型无关(正是因为值类型不是引用,而是直接值)。
例如,如果我有一个带有PersonStringValueType name属性的DateValueType dateOfBirth值类型(这里dateOfBirth将是一个包含int yearint monthint day属性的嵌套值类型),我如何以通用方式初始化我的Person值类型,以便其属性值分别为""name(0, 0, 0)dateOfBirth(或相应的默认值)?
更清楚地说,如果这是C,我会:

memset(myPersonStructVariable, 0, sizeof(Person));

或现代C:
struct Person myPersonStructVariable = {0};

最佳答案

与字节码等价的值类型(即引用类型的默认值)是字节码。从最小值类型规范:
6.5 aconst_null
操作
推送直接值类类型的默认值
格式

vdefault indexbyte1 indexbyte2


说明
无符号indexbyte1和indexbyte2用于构造索引
进入当前类(2.6)的运行时常量池,其中
索引值为(indexbyte1<<8)indexbyte2。运行时
该索引处的常量池项必须是对
直接值类类型(4.4.1)。类型已解析(5.4.3.1)。
如果命名类尚未初始化(5.5),则初始化该类
已初始化。直接值类的默认值(2.3.5)
类型被推送到操作数堆栈上。
和2.3.5:
2.3.5 Direct Value Class Types

直接值类类型的默认值是类实例
其字段存储各自类型的默认值。在那里
不是直接值类类型的特殊空值。
引用this presentation的一句话:
[默认值],实际上是一个宽度正确的值,所有0都在里面。
所以这类似于在c中使用null所做的操作。
目前没有对值类型的语言支持,所以我们不能说是否会有像vdefault文本这样的东西返回值类型的默认值(例如vdefault或类似的东西),但是字节码是存在的。演示还显示了如何使用方法句柄调用memset(myStructVar, 0, size)。或者,你必须旋转字节码。
将字段初始化为用户定义的值(例如nullforMyValueType x = default(MyValueType))可能只是通过调用构造函数(或等价的值类型)来实现的。但现在还不清楚,所以我们只能推测。
另外,在这里查看Valhalla虚拟机原型的最新草稿:http://mail.openjdk.java.net/pipermail/valhalla-dev/2017-December/003631.html

本文翻译自 https://stackoverflow.com/questions/48709375/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 java initialization value-type project-valhalla


相关文章:

java - Scala项目作为eclipse中Java项目的“子项目”

java - 根据Spark中的等级分离数据集

ios - 使用Swift初始化属性时遇到麻烦

swift - 禁止直接分配的可变属性-Swift

c# - 使用比较运算符,例如'!='和'==',并在C#中将泛型限制为值[重复]

c# - 比较没有拳击的平等结构

java - 使stringTokenizer将文本行拆分为预定义变量的最佳方法是什么

java - 如何重置以前单击的按钮的颜色?

c++ - Eigen C ++中的逗号初始化问题

c - 使用先前声明的数组初始化结构