有没有办法在 Kotlin 的泛型函​​数中添加多个约束边界?

moh*_*arf 2 android kotlin

有没有办法为泛型函数添加多个类型参数?

我有两个数据类,它们有一些相同的字段,我只想将它们与一个函数进行比较。像这样的东西:

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)

但我得到

只有一个上限可以是一类

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

Ale*_*nov 6

问题在于多个类型边界(恰好使用此语法)是通过“and”而不是“or”连接的。因此T需要是 和 的子类型 ClassAClassB当然是不可能的。目前还没有办法做“或”。将来 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::fieldClassB::field