有没有办法在Kotlin的泛型函数中添加多个约束范围?

时间:2019-11-28 09:55:39

标签: 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
}

但是我明白了

  

一个上限只能是一个类

是否可以将两个类作为上限?

1 个答案:

答案 0 :(得分:1)

问题在于,多个类型范围(正是使用此语法)通过“和”而不是“或”连接。因此,T必须同时是 ClassAClassB的子类型,这当然是不可能的。目前没有办法做“或”。将来,科特林可能会获得联合类型,这样您就可以编写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
}

但是,如果您拥有ClassAClassB,则可以添加一个接口:

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