gpt4 book ai didi

generics - Kotlin 实体化类型参数不智能转换

转载 作者:IT老高 更新时间:2023-10-28 13:42:08 31 4
gpt4 key购买 nike

我正在尝试设置 未初始化 值,并试图让以下工作。这主要是对物化泛型的力量(和局限性)的好奇。

我试图为数据类的可选参数提供默认值。

inline fun <reified T> uninitialized(): T = when (T::class) {
Long::class -> -1L // Type mismatch. Required: T Found: Long
String::class -> "" // Type mismatch. Required: T Found: String
// and so on...
else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class)
}

data class Thing(
var id: Long = uninitialized(),
var name: String = uninitialized() // and so on...
)

when 包含 is Type 子句时,Kotlin 具有智能转换。在此示例中,智能转换没有启动,因此无法编译。

有什么想法可以完成类似的事情吗?

最佳答案

在您使用 is 检查其类型或将其与 null 进行比较后,将智能转换应用于特定对象。在您的示例中,没有可以检查类型的特定对象,也没有可以应用智能转换的对象。

但是,您可以将手动转换应用于 T,这将按预期工作。这是您的示例函数的工作版本,已更新以处理将在 1.1 中修复的 Kotlin 反射库的特性:

inline fun <reified T : Any> uninitialized(): T = when (T::class.java) {
Long::class.javaPrimitiveType, Long::class.javaObjectType -> -1L as T
String::class.java -> "" as T
// and so on...
else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class)
}

data class Thing(
var id: Long = uninitialized(),
var name: String = uninitialized() // and so on...
)

fun main(args: Array<String>) {
val t = Thing()
println(t.id)
}

关于generics - Kotlin 实体化类型参数不智能转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38858672/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com