У меня проблема с обнуляемостью Котлина, и мне интересно, могу ли я решить ее с помощью контрактов.Для такого Java
интерфейса: interface Action<T>{ void execute(T param); }
есть два расширения:
fun <T, R> Action<T>.map(mapper:(R)->T): Action<R> {
return Action{ execute(mapper(it)) }
}
и
fun <T> Action<T>.ifNotNull(): Action<T> {
return Action { if(it != null) execute(it) }
}
Существует также общая модель с обнуляемыми данными:
class Model<T>(val data: T?)
Теперь я создал функцию, которая принимает Action
интерфейс в качестве аргумента.Дело в том, что аргумент действия следует выполнять только тогда, когда param != null
, поэтому он выглядит следующим образом:
fun <T> callback(model: Model<T>, action: Action<T>){
action
.map{ it.getData() } //compilation error: getData return T? when action require T
.ifNotNull() //execute only when data!=null
.execute(model)
}
Итак, есть ли возможность использовать контракт Kotlin, чтобы компилятор не выполнял action
с нулемпараметр