【发布时间】:2019-12-19 21:42:59
【问题描述】:
我正在尝试实现类似于以下玩具示例的内容:
fun getBoolean() = true
fun getFloat() = 1.0F
fun getInt() = 1
fun getLong() = 1L
fun getString() = "foobar"
fun <T> extract(defaultVal: T): T = when (defaultVal) {
is Boolean -> getBoolean() as T
is Float -> getFloat() as T
is Int -> getInt() as T
is Long -> getLong() as T
is String -> getString() as T
else -> defaultVal
}
在不同的情况下,有没有办法在没有未经检查的演员 as T 的情况下实现这一目标?
删除未经检查的强制转换会导致编译器错误,返回类型是函数的类型,而不是 T。我觉得编译器应该能够通过defaultVal is ____ 中的when 语句推断T,类似于智能转换:
fun usesInt(arg: Int) = arg + 1
fun <T> extract(defaultVal: T): T = when (defaultVal) {
// ...
is Int -> {
usesInt(defaultVal) // defaultVal is smart cast to Int => T is Int
getInt() as T
}
// ...
}
这是智能投射/推理系统的缺点,还是我在这里遗漏了什么?
【问题讨论】: