首页 > 解决方案 > 有没有办法在 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
}

但我明白了

只有一个上限可以是一个类

有没有办法让两个类作为上限?

标签: androidkotlin

解决方案


问题是多个类型边界(完全使用这种语法)是由“and”而不是“or”连接的。soT需要是and的子类型, 当然是不可能的。目前没有办法做“或”。将来 Kotlin可能会得到联合类型,这会让你写,但我不希望ClassAClassBT : ClassA | ClassB

val x: ClassA | ClassB = ...
x.field

即使在那时也可以工作,相反,您可能不得不

val x: ClassA | ClassB = ...
when(x) {
    is ClassA -> // use ClassA.field
    is ClassB -> // use ClassB.field
}

但是如果你拥有ClassAand 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::fieldClassB::field


推荐阅读