Kotlin中具有泛型类型的Lambda val

时间:2019-03-24 03:53:56

标签: generics kotlin

说我有这个Kotlin typealias

typealias Checker<T> = (T) -> Unit

fun <T> checkNothing(input: T) = Unit
fun <T> checkSomething(input: T) = makeSomeAssertion(input)

fun <T> doSomethingWithAChecker(checker: Checker<t>) { /* ... */ }

现在我可以调用doSomethingWithAChecker(::checkNothing)doSomethingWithAChecker(::checkSomething),这很好,但是我宁愿使用lambda和正确的类型别名定义val,所以只有一个实例:

val checkNothing: Checker<T> = { Unit }
val checkSomething: Checker<T> = { makeSomeAssertion(it) }

但是,当然,因为它们被实例化了,所以它们不能具有泛型T,所以我要么必须定义一个类型,要么就不能将它们传递给doSomethingWithAChecker

没有类型转换就可以吗?

2 个答案:

答案 0 :(得分:2)

val声明可以包装到一个通用类中,该类将提供检查器的类型。

class Checkers<T> {
    val checkNothing: Checker<T> = { Unit }
    val checkSomething: Checker<T> = { makeSomeAssertion(it) }
}

答案 1 :(得分:0)

您可以在此处使用Any类型来接受任何内容:

val checkNothing: Checker<Any> = { Unit }
checkNothing(123)
checkNothing("abc")
val checkSomething: Checker<Any> = { makeSomeAssertion(it) }
checkSomething(123)
checkSomething("abc")

由于这里的检查者是使用者,因此使用<in Any>而不是仅仅使用<Any>可能更正确;有关更多详细信息,请参见generics reference documentation