是否可以为通用函数添加多个类型参数?
我有两个数据类,它们的某些字段相同,并且我只想将它们与一个函数进行比较。像这样:
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
}
但是我明白了
一个上限只能是一个类
是否可以将两个类作为上限?
答案 0 :(得分:1)
问题在于,多个类型范围(正是使用此语法)通过“和”而不是“或”连接。因此,T
必须同时是 ClassA
和ClassB
的子类型,这当然是不可能的。目前没有办法做“或”。将来,科特林可能会获得联合类型,这样您就可以编写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
。