Наша кодовая база имеет интерфейс с большим количеством реализаций. Они сериализуются, хранятся и десериализуются. Когда один десериализован, мы вызываем функцию, которая принимает тип интерфейса, который затем имеет гигантское условие when, которое ветвится на основе определенного типа, то есть
when (t) {
is SubType1 -> ...
is SubType2 -> ...
is SubType44 -> ...
}
Это грубое и добавляет высокую сложность функции,Одна из возможностей - переместить действие, которое мы хотим выполнить, в сами фактические реализации, поэтому мы можем просто вызвать t.doAction () и исключить предложение when. Это нормально, но эта конкретная логика на самом деле не относится к реализациям (по причинам), поэтому было бы лучше иметь возможность вместо этого вызывать перегруженные функции с типом параметра, а kotlin выяснить, какой из них вызывать, основываясь на типе реализации. ,К сожалению, это не похоже на это;мы получаем «Ни одна из следующих функций не может быть вызвана с предоставленными аргументами».
Есть ли здесь шаблон, который мы могли бы использовать, который бы удовлетворял компилятору?
Придуманный пример ниже. i1 - это Int внутри, но компилятор не может этого увидеть, потому что он напечатан как интерфейс, то есть Number.
fun test() {
val e = Example()
val i1 = 123 as Number
val i2 = 123.0
e.sqrt(i1)
e.sqrt(i2)
}
class Example {
fun sqrt(i: Int) {
}
fun sqrt(i: Double) {
}
}
}