android - 有没有办法在 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”连接的。soT
需要是and的子类型,这 当然是不可能的。目前没有办法做“或”。将来 Kotlin可能会得到联合类型,这会让你写,但我不希望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
and 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
。
推荐阅读
- kubernetes-helm - 在 HELM 模板定义函数中使用变量
- firebase - 在多个屏幕中调用相同的 onAuthStateChanged 监听器会创建新的监听器?
- listview - SwipeView 仅在执行滑动后对某些行做出响应!(直到页面手动导航)
- html - 从 jQuery 和 Thymeleaf 中的输入计算值?
- snowflake-cloud-data-platform - 带有更改日志的雪花建模,仅包含新记录和已删除记录
- language-agnostic - 编程世界中“业务逻辑”这个词的词源是什么?
- java - 转换 CompletableFuture
> 上课 - python - 我正在尝试在链接列表中搜索特定项目
- java - Java中的嵌套for循环优化-流替代导致不同的结果
- python - 子类实例的Python类型签名?