Есть несколько проблем с предоставленным кодом, в основном с дженериками.Но я думаю, что главное, что вы задавали в этих вопросах, было исчерпывающим when
.Если вы хотите сопоставить по типу, вы пишете
is SomeClass
для классов Object
для объектов null
для нуля
Итак, ваш when
должен выглядеть так:
when (v1) {
is HasValue<*> -> /* Filter collection elements that have some attr set to given value */
IsNull -> /* filter collection elements that have some attr set to null */
null -> /* do nothing, return all elements */
}
и весь код:
sealed class Expr {
data class HasValue<out T>(val value: T) : Expr()
object IsNull: Expr()
}
private fun <T> filter(v1: Expr? = null, v2: Expr? = null): Collection<T> {
when (v1) {
is HasValue<*> -> /* Filter collection elements that have some attr set to given value */
IsNull -> /* filter collection elements that have some attr set to null */
null -> /* do nothing, return all elements */
}
// matching with v2
}
/* call site */
filter<Int>(v1=IsNull, v2=HasValue("string"))