【问题标题】:Call from Kotlin a Java generic method defined with multiple bounds, one bound is itself a generic type从 Kotlin 调用定义有多个边界的 Java 泛型方法,一个边界本身就是泛型类型
【发布时间】:2020-04-22 22:48:43
【问题描述】:

我正在 Kotlin 中构建一个 Kubernetes 运算符,并尝试调用一个定义了多个边界的通用方法。方法签名如下:

<C extends Namespaceable<C> & KubernetesClient> LeaderElectorBuilder<C> leaderElector();

你可以在这里找到源代码:https://github.com/fabric8io/kubernetes-client/blob/1150135f9febfd000396c031532efe5856037043/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/KubernetesClient.java#L427-L433

Java 中的多边界语法允许在泛型类或方法定义中使用的类型定义多个约束。见https://www.tutorialspoint.com/java_generics/java_generics_multiple_bounds.htm

我尝试在 Kotlin 中调用该方法,但它无法推断类型,并且编译器不接受我的任何定义。

如果我这样做:

client.leaderElector()

Kotlin 会抱怨“Not enough information to infer type variable C”。

拒绝任何显式类型,通常:

client.leaderElector<KubernetesClient>()

Kotlin 会抱怨“类型参数不在其范围内。预期:可命名空间!找到:KubernetesClient!

如果我使用 Namespaceable&lt;KubernetesClient&gt; 作为显式类型,则相反(“预期:KubernetesClient!找到:Namespaceable”)。

如何在 Kotlin 中正确调用该方法?

提前致谢!

【问题讨论】:

  • ... 我的意思是,这些类型 do 都不满足界限。选择一个真正满足他们的类型(或创建一个类)并且它可能会工作?从我看到的代码来看,Namespaceable&lt;KubernetesClient&gt; 不一定是KubernetesClientKubernetesClient 不一定是Namespaceable&lt;KubernetesClient&gt;
  • 也许您需要一个联合 KubernetesClientNamespaceable&lt;T&gt; 的类型,例如 class MyClass : KubernetesClient, Namespaceable&lt;MyClass&gt;

标签: java generics kotlin kubernetes


【解决方案1】:

非常感谢您的帮助。

确实,解决方案是结合两种可能的类型以匹配通用定义的自定义类。

下面是一个使用这种方法并使 Kotlin 编译器满意的类示例:

package org.mypackage

import io.fabric8.kubernetes.client.DefaultKubernetesClient
import io.fabric8.kubernetes.client.KubernetesClient
import io.fabric8.kubernetes.client.dsl.Namespaceable

abstract class MyClass : KubernetesClient, Namespaceable<MyClass>

class Test(kubernetesClient: KubernetesClient) {

    val kubernetesClient: KubernetesClient = DefaultKubernetesClient()

    fun test() {
        kubernetesClient.leaderElector<MyClass>()
    }
}

【讨论】:

    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多