有没有办法在 Kotlin 的泛型函数中添加多个约束边界?



有没有办法为泛型函数添加多个类型参数?

我有两个数据类,它们的某些字段相同,我想将它们与一个函数进行比较。像这样:

data class ClassA{
val field: String?
...
}
data class ClassB{
val field: String?
...
}

泛型函数应该是这样的:

private fun <T> mapSomething(model: T): String
where T : ClassA,
T: ClassB {
// do something with model.field and return String
}

但我得到

只有一个上限可以是一个类

有没有办法将两个类作为上限?

问题是多个类型边界(完全使用此语法(由"and"而不是"or"连接。所以T需要同时ClassAClassB的子类型,这当然是不可能的。目前没有办法做"或"。将来 Kotlin可能会获得联合类型,这会让你写T : ClassA | ClassB,但我没想到

val x: ClassA | ClassB = ...
x.field

即使那样工作,您可能也必须

val x: ClassA | ClassB = ...
when(x) {
is ClassA -> // use ClassA.field
is ClassB -> // use ClassB.field
}

但是如果你拥有ClassAClassB,你可以添加一个接口:

interface HasField {
val field: String?
}
data class ClassA : HasField {
override val field: String?
...
}
data class ClassB : HasField {
override val field: String?
...
}

或者:

private fun <T> mapSomething(model: T, getField: (T) -> String?): String {
...
}

并分别通过ClassA::fieldClassB::field