调用泛型函数有多个界限吗?

时间:2018-07-24 07:42:27

标签: kotlin

此Java代码的kotlin等效项是什么?

private A typeA;
private B typeB;

public Test(){
  typeA = createType();
  typeB = createType();
}

private <T extends A & B> T createType(){
    return null;
}

我尝试使用Kotlin转换器。我无法调用createType()。

如何实现?

3 个答案:

答案 0 :(得分:0)

很难从示例中了解意图,但是这里是如何表达双重上限的方法:

interface A
interface B

fun <T> createType():T where T : A, T : B {
  return TODO()
}

但这与您的用法示例不兼容:

fun test() {
  val typeA: A = createType()  // error
  val typeB: B = createType()  // error
}

如果A不是B的子类型,那怎么办?也许有一个更现实的用法示例?

答案 1 :(得分:0)

这就是Kotlin的样子:

private var typeA: A? = null
private var typeB: B? = null

fun test() {
    typeA = createType<C>()
    typeB = createType<C>()
}

private fun <T> createType(): T? where T : A, T : B {
    return null
}

open class A
interface B
class C: A(), B

请注意,where子句中最多只能有一个类,其余的必须是接口,并且在调用createType时,需要提供满足范围的类型参数(在这种情况扩展了A并实现了B

答案 2 :(得分:0)

不是您真正想要的,但是您的Java示例已经可以简化为:

private <T> T createType(){
  return null;
}

由于您的typeAtypeB已经众所周知,因此也可以使用。 在Kotlin中可以轻松地将其转换为以下内容:

fun <T> createType() : T = TODO("implement me")

如果您提供有关为什么真正需要T extends A & B的更多信息,答案可能会更好。