Что вы, вероятно, хотели сделать, это val name = nameInlineClass.value
, но я попытаюсь объяснить ошибку.
См. Представление из документов (включая пример кода):
В сгенерированном коде компилятор Kotlin сохраняет оболочку для каждого встроенного кода
учебный класс. Встроенные экземпляры классов могут быть представлены во время выполнения как
обертки или как базовый тип. Это похоже на то, как Int может быть
представляется либо как примитив int, либо как целочисленная оболочка.
Это означает, что до тех пор, пока вы не будете ссылаться на объект обтекания или его тип явно, значение не будет упаковано. Мы можем проверить это, проверив байт-код (декомпилированный обратно в Java для удобства чтения):
// kotlin source
fun unwrapping() {
val nameInlineClass = NameInlineClass(NAME)
val name = nameInlineClass // this line gets dropped by compiler by the way
assertEquals(name, NAME)
}
// java representation of bytecode
public final void unwrapping() {
String nameInlineClass = NameInlineClass.constructor-impl("JACK");
Assert.assertEquals(NameInlineClass.box-impl(nameInlineClass), "JACK");
}
Я не буду вставлять все сгенерированное NameInlineClass
тело, но constructor-impl
- статический метод, который проверяет только null
из value
, а box-impl
создает объект-оболочку.
Как видите, nameInlineClass
- это действительно String
- это означает, что встроенные операции не выполняются, и никакой дополнительный объект не был выделен.
Только когда вы ссылаетесь на nameInlineClass
вместо nameInlineClass.value
, компилятор определяет, что этот объект нуждается в представлении и "помещает" значение в обертку NameInlineClass
class.