【发布时间】:2019-09-03 21:23:02
【问题描述】:
今天我在创建一些 Kotlin 泛型时遇到了奇怪的行为。下面的代码说明了这个问题。
MCVE
class Generic<T>(private val initial: T? = null, private val source: (T)->Unit) {
fun test(value: T) = source(value)
}
fun <T> createGeneric(initial: T? = null, source: (T)->Unit) = Generic(initial, source)
fun test() {
val generic = createGeneric(null) { arg: Int -> println(arg) }
generic.test(42)
}
generic.test(42) 行产生错误:
整型文字不符合预期的类型 Nothing
问题:我通过{ arg: Int -> println(arg) } lambda,即(Int)->Unit,如何将T推导出为Nothing?我仔细检查了变量generic的类型,推断为Generic<Nothing>。
另外,如果类型被推断为Nothing,为什么它允许将(Int)->Unit类型的lambda作为第二个参数传递?
【问题讨论】:
-
我可以通过明确声明
createGeneric返回Generic<T>来实现此功能