Следующий минимальный пример хорошо показывает мою проблему, я надеюсь:
data class OneThing(val x: Int, val y: Int, val foo: String)
data class ASimilarThing(val x: Int, val y: Int, val bar: String)
fun <THING> process(thing: THING) {
println(thing.x)
println(thing.y)
}
fun main() {
val oneThing = OneThing(1, 2, "hi")
val aSimilarThing = ASimilarThing(3, 4, "ho")
process(oneThing)
process(aSimilarThing)
}
Два класса OneThing
и ASimilarThing
взяты из библиотеки, поэтому я не могу их изменить. Но семантически они очень похожи, и я хотел бы избежать реализации моей логики два раза, поэтому я хотел бы иметь ее в общей функции process
.
Однако вышеприведенное не компилируется. ( В C ++ это возможно. )
Есть ли способ заставить process
работать? В идеале я ищу что-то вроде
fun <THING: [OneThing, ASimilarThing]> process(thing: THING) { ... }
Но такого синтаксиса не существует.
Есть еще идеи? :)