【发布时间】:2019-03-24 03:53:55
【问题描述】:
假设我有这个 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),这很好,但我宁愿用 lambdas 和正确的类型别名定义 val,这样就只有一个实例:
val checkNothing: Checker<T> = { Unit }
val checkSomething: Checker<T> = { makeSomeAssertion(it) }
当然,因为它们是实例化的,所以它们不能拥有通用的T,所以我要么必须定义一个类型,要么不能将它们传递给doSomethingWithAChecker。
如果没有类型转换,这可能吗?
【问题讨论】:
-
你是什么意思,“我宁愿用 lambdas 和正确的类型别名来定义 val,这样只有一个实例”?是否要避免多次使用
::checkSomething引用? -
是的。我使用 ::checkSomething 作为通用函数的默认参数(即问题中的 doSomethingWithAChecker )。所以我认为它每次都会不必要地实例化检查器,即使只需要一个。
-
AFAIK 我认为使用
::someFunctuon不会对性能产生任何重大影响或导致多次引用。为什么要避免多次使用::checkSomething?