Digamos que tengo este typealias Kotlin:
typealias Checker<T> = (T) -> Unit fun <T> checkNothing(input: T) = Unit fun <T> checkSomething(input: T) = makeSomeAssertion(input) fun <T> doSomethingWithAChecker(checker: Checker<t>) { /* ... */ } Ahora puedo llamar a doSomethingWithAChecker(::checkNothing) o doSomethingWithAChecker(::checkSomething) , lo cual está bien, pero prefiero definir val con lambdas y el alias de tipo adecuado para que solo haya una instancia:
val checkNothing: Checker<T> = { Unit } val checkSomething: Checker<T> = { makeSomeAssertion(it) } Pero, por supuesto, dado que están instanciados, no pueden tener esa T genérica, por lo que tengo que definir un tipo o no puedo pasarlos a doSomethingWithAChecker .
¿Es esto posible sin tipos de conversión?
Las declaraciones de val se pueden envolver en una clase genérica que proporcionaría los tipos de las fichas.
class Checkers<T> { val checkNothing: Checker<T> = { Unit } val checkSomething: Checker<T> = { makeSomeAssertion(it) } }puede usar Any tipo aquí para aceptar cualquier cosa:
val checkNothing: Checker<Any> = { Unit } checkNothing(123) checkNothing("abc") val checkSomething: Checker<Any> = { makeSomeAssertion(it) } checkSomething(123) checkSomething("abc") Dado que sus damas aquí son consumidores, puede ser más correcto usar <in Any> en lugar de solo <Any> ; se pueden leer más detalles al respecto en la documentación de referencia de genéricos