Android 有没有办法在Kotlin的泛型函数中添加多个约束边界?
有没有办法为泛型函数添加多个类型参数 我有两个数据类,它们的一些字段是相同的,我只想用一个函数来比较它们。大概是这样的:Android 有没有办法在Kotlin的泛型函数中添加多个约束边界?,android,kotlin,Android,Kotlin,有没有办法为泛型函数添加多个类型参数 我有两个数据类,它们的一些字段是相同的,我只想用一个函数来比较它们。大概是这样的: data class ClassA{ val field: String? ... } data class ClassB{ val field: String? ... } 泛型函数应该类似于: private fun <T> mapSomething(model: T): String where T : ClassA,
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
}
private-fun-mapsothing(model:T):字符串
其中T:ClassA,
T:B级{
//对model.field和返回字符串执行一些操作
}
但我明白了
一个类只能有一个上界
有没有办法将两个类作为上界?问题是,多个类型边界(使用这种语法)是通过“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 {
...
}
private-fun-mapsothing(model:T,getField:(T)->String?:String{
...
}
并分别通过
ClassA::field
或ClassB::field
。这对您有用吗?就我而言,不是真的,但似乎是个好主意。:)