繁体   English   中英

Kotlin 中具有泛型类型的 Lambda val

[英]Lambda val with generic type in 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

如果没有类型转换,这可能吗?

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

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

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

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

由于这里的检查器是消费者,因此使用<in Any>而不仅仅是<Any>可能更正确; 更多细节可以在泛型参考文档中阅读

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM