有没有办法为泛型函数添加多个类型参数?
我有两个数据类,它们有一些相同的字段,我只想将它们与一个函数进行比较。像这样的东西:
data class ClassA{
val field: String?
...
}
data class ClassB{
val field: String?
...
}
Run Code Online (Sandbox Code Playgroud)
通用函数应该是这样的:
private fun <T> mapSomething(model: T): String
where T : ClassA,
T: ClassB {
// do something with model.field and return String
}
Run Code Online (Sandbox Code Playgroud)
但我得到
只有一个上限可以是一类
有没有办法以两个类别作为上限?
问题在于多个类型边界(恰好使用此语法)是通过“and”而不是“or”连接的。因此T需要是 和 的子类型, ClassA这ClassB当然是不可能的。目前还没有办法做“或”。将来 Kotlin可能会获得联合类型,这将允许你编写T : ClassA | ClassB,但我不希望
val x: ClassA | ClassB = ...
x.field
Run Code Online (Sandbox Code Playgroud)
即使那样也要工作,相反你可能不得不
val x: ClassA | ClassB = ...
when(x) {
is ClassA -> // use ClassA.field
is ClassB -> // use ClassB.field
}
Run Code Online (Sandbox Code Playgroud)
但如果你拥有ClassAand ClassB,你可以只添加一个接口:
interface HasField {
val field: String?
}
data class ClassA : HasField {
override val field: String?
...
}
data class ClassB : HasField {
override val field: String?
...
}
Run Code Online (Sandbox Code Playgroud)
或者:
private fun <T> mapSomething(model: T, getField: (T) -> String?): String {
...
}
Run Code Online (Sandbox Code Playgroud)
并分别通过ClassA::field或ClassB::field。
| 归档时间: |
|
| 查看次数: |
4747 次 |
| 最近记录: |