[英]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.