我现在正在使用以下代码片段,并希望使用“值类”构造来简化此操作:
@JvmInline
value class SomeId(private val id: String)
data class SomeModel(val id: SomeId, val name: String)
data class SomeHtmlModel(val id: String, val name: String)
val id = SomeId("1")
val value = SomeModel(id, "name")
val result = SomeHtmlModel(id, value.name)
现在,不幸的是这不起作用,因为SomeHtmlModel
需要一个字符串并且 IntelliJ 告诉我存在类型不匹配。我理解整个概念错了吗?我可以使用如上所示的值类吗?
从文档中我还发现了这一点:
// No actual instantiation of class 'Password' happens
// At runtime 'securePassword' contains just 'String'
val securePassword = Password("Don't try this in production")
这给人的印象是我可以将id
变量直接分配给字符串参数。
是的,你误会了。在文档中,当将值类与类型别名进行比较时,他们说:
类型别名与其底层类型 [...] 赋值兼容,而内联类则不然。
因此,值类与其底层值的赋值不兼容,如果您想以这种方式使用它们,则必须解开它们。
他们也举了一个例子:
val nameInlineClass = NameInlineClass("")
acceptString(nameInlineClass) // Not OK: can't pass inline class instead of underlying type
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句