说我有这个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
。
没有类型转换就可以吗?
答案 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