Лямбда-вал с родовым типом в Котлине - PullRequest
2 голосов
/ 24 марта 2019

Скажем, у меня есть этот 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), что хорошо, но я бы лучше определил valс лямбдами и правильным псевдонимом типа, так что всегда есть только один экземпляр:

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

Но, конечно, поскольку они созданы, у них не может быть этого общего T, поэтому я должен либо определить типили я не могу передать их в doSomethingWithAChecker.

Возможно ли это без приведения типов?

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Объявления val можно обернуть в общий класс, который будет предоставлять типы шашек.

class Checkers<T> {
    val checkNothing: Checker<T> = { Unit }
    val checkSomething: Checker<T> = { makeSomeAssertion(it) }
}
0 голосов
/ 24 марта 2019

Вы можете использовать тип Any здесь, чтобы принять что-либо:

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

Поскольку ваши шашки здесь являются потребителями, может быть более правильным использовать <in Any>, а не просто <Any>;Подробнее об этом можно прочитать в справочной документации обобщения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...