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

原文 标签 java initialization value-type project-valhalla

在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};

最佳答案

aconst_null字节码等效的值类型(即null,这将是引用类型的默认值)是vdefault字节码。根据最小值类型规范:

6.5 vdefault

操作

推送直接值类类型的默认值

格式

vdefault indexbyte1 indexbyte2

...

说明

无符号的indexbyte1和indexbyte2用于构造索引
放入当前类(2.6)的运行时常量池中
索引的值是(indexbyte1 << 8)|索引字节2。运行时
该索引处的常量池项必须是对
直接值类别类型(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中使用memset(myStructVar, 0, size)进行的操作。

当前不支持值类型的语言,因此我们无法确定是否存在诸如null文字之类的东西会返回值类型的默认值(例如MyValueType x = default(MyValueType)或类似的东西),但是字节码存在。该演示文稿还显示了如何使用方法句柄来调用vdefault。或者,您必须旋转字节码。

将字段初始化为用户定义的值(例如""StrinValueType)可能仅通过调用构造函数(或等效的值类型)来进行。但是目前还不清楚,因此我们只能推测。

另外,在此处查看valhalla vm原型的最新草案:http://mail.openjdk.java.net/pipermail/valhalla-dev/2017-December/003631.html

相关文章:

java - 将BigInteger转换为密钥

java - 为什么有时位图是相同的对象?

c - 自动存储持续时间结构初始化

python - 类变量丢失赋值范围

c# - 如何使用反射创建值类型的实例

java - 为什么我们必须使用精确的DataOutputStream来传输文本数据?

java - 两全其美:浏览器和桌面游戏?

java - 为什么必须强制初始化静态最终变量?

c# - C#,将一个布尔复制到另一个(通过引用,而不是val)

c# - Convert.ToBoolean失败,值为“0”