Как обобщенно инициализировать тип значения значением по умолчанию?
В контексте проекта Java Valhalla, как я могу в общих чертах инициализировать тип значения его значением по умолчанию?
Изначально я думал, что присвоение null
для любого типа значения будет выполнять эту инициализацию. Тем не менее, ответы и комментарии на этот вопрос ясно показывают, что null
является ссылкой, поэтому она не имеет ничего общего с типами значений (именно потому, что типы значений являются не ссылками, а прямыми значениями).
Например, если у меня есть Person
тип значения с StringValueType name
а также DateValueType dateOfBirth
атрибуты (здесь dateOfBirth
будет вложенный тип значения, содержащий int year
, int month
а также int day
атрибуты), как я мог инициализировать мой Person
тип значения универсальным образом, так что значения его атрибутов ""
за name
а также (0, 0, 0)
(или соответствующее значение по умолчанию) для dateOfBirth
соответственно?
Чтобы было понятнее, если бы это был C, я бы сделал:
memset(myPersonStructVariable, 0, sizeof(Person));
Или в современном C:
struct Person myPersonStructVariable = {0};
1 ответ
Тип значения, эквивалентный aconst_null
байт-код (т.е. null
, который будет по умолчанию для ссылочных типов), является vdefault
байткод. Из спецификации минимального значения типа:
6,5
vdefault
операция
Нажмите значение по умолчанию для типа класса прямого значения
Формат
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 Типы классов с прямым значением
...
Значением по умолчанию для типа класса с прямым значением является экземпляр класса, в полях которого хранятся значения по умолчанию их соответствующих типов. Специального значения NULL для типа класса с прямым значением не существует.
И цитата из этой презентации гласит:
[Значение по умолчанию], которое действительно является значением правильной ширины со всеми 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 December/003631.html