Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有没有办法在Kotlin的泛型函数中添加多个约束边界?_Android_Kotlin - Fatal编程技术网

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

Android 有没有办法在Kotlin的泛型函数中添加多个约束边界?,android,kotlin,Android,Kotlin,有没有办法为泛型函数添加多个类型参数 我有两个数据类,它们的一些字段是相同的,我只想用一个函数来比较它们。大概是这样的: data class ClassA{ val field: String? ... } data class ClassB{ val field: String? ... } 泛型函数应该类似于: private fun <T> mapSomething(model: T): String where T : ClassA,

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

我有两个数据类,它们的一些字段是相同的,我只想用一个函数来比较它们。大概是这样的:

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
}
private-fun-mapsothing(model:T):字符串
其中T:ClassA,
T:B级{
//对model.field和返回字符串执行一些操作
}
但我明白了

一个类只能有一个上界


有没有办法将两个类作为上界?

问题是,多个类型边界(使用这种语法)是通过“and”连接的,而不是“or”。因此,
T
需要同时是
ClassA
ClassB
的子类型,这当然是不可能的。而目前没有办法做到“或”。将来Kotlin可能会得到联合类型,这将允许您编写
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
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 {
    ...
}
private-fun-mapsothing(model:T,getField:(T)->String?:String{
...
}

并分别通过
ClassA::field
ClassB::field

这对您有用吗?就我而言,不是真的,但似乎是个好主意。:)