有没有办法为泛型函数添加多个类型参数?
我有两个数据类,它们的某些字段相同,我想将它们与一个函数进行比较。像这样:
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
需要同时是ClassA
和ClassB
的子类型,这当然是不可能的。目前没有办法做"或"。将来 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
}
但是如果你拥有ClassA
和ClassB
,你可以添加一个接口:
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::field
或ClassB::field
。