java - 从 Java 中调用具有类委托(delegate)的 Kotlin 对象作为静态方法

标签 java delegates kotlin kotlin-interop

这可能有点难以描述,所以我将尝试给出一个具体示例来说明我正在尝试做的事情。

假设我们有一个 Facade 接口(interface)和类(在 Java 中),像这样:

interface FacadeInterface<T> {
    void method(String from, String via);
}

class Facade<T> implements FacadeInterface<T> {
    private Class<T> mClazz;

    public Facade(Class<T> clazz) {
        mClazz = clazz;
    }

    @Override
    public void method(String from, String via) {
        System.out.println("Method called from " + from + " via " + via);
    }
}

在我的应用程序中,我需要多个单例来保存外观的实例。真正的外观有额外的设置/配置参数,但这些在这里无关紧要。

在我开始使用 kotlin 之前,我会有一个类,它包含一个门面的静态实例(不是真正的单例,但在我的例子中,它具有类似的目的),它代理对门面的调用,如下所示:

public class Singleton {
    private static final FacadeInterface<String> sFacade = new Facade<>(String.class);

    private Singleton() {
    }

    public static void method(String from, String via) {
        sFacade.method(from, via);
    }
}

现在,有了 Kotlin,我们有了类委托(delegate),让我可以编写如下内容:

object SingletonKt : FacadeInterface<String> by Facade(String::class.java)

这很好 - 没有更多样板,我可以调用 SingletonKt 来自 Kotlin 类,与我调用 java Singleton 的方式相同:

Singleton.method("Kotlin", "Singleton")
SingletonKt.method("Kotlin", "SingletonKt")

但是,当我使用 SingletonKt 时出现了一个小问题来自 Java。然后我必须指定INSTANCE :

Singleton.method("Java", "Singleton");
SingletonKt.INSTANCE.method("Java", "SingletonKt");

我知道 @JvmStatic注释,但我可以把它放在 SingletonKt 中的唯一位置不会导致编译错误的文件就在 FacadeInterface 之前而且它似乎不起作用。

有没有办法设置这个类委托(delegate),这样我就可以从 Java 调用它,就好像它是一个静态方法一样,而无需引入为 SingletonKt 创建代理方法的样板文件(这会破坏类委托(delegate)的目的)?

最佳答案

遗憾的是不可能!

Kotlin Delegation是减少样板代码的好方法。但它伴随着无法实际访问类体内的委托(delegate)。

您面临的关于 @JvmStatic 的第二个问题实际上比第一个问题更严重,并且在手动实现委托(delegate)时也适用于您:

Override members cannot be '@JvmStatic' in object

因此,您可以将其委托(delegate)给对象上的 staticMethod(),而不是仅通过 INSTANCE 公开 method()。这仍然与您的意图不同,但接近它。

object SingletonKt : FacadeInterface<String> by Facade(String::class.java)
    @JvmStatic fun staticMethod(from: String, via: String) = method(from, to)
}

关于java - 从 Java 中调用具有类委托(delegate)的 Kotlin 对象作为静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44454291/

相关文章:

java - 在 ScrollView 中显示图像

java - Selenium 单击 href 为 javascript :void[0]; 的链接

java - java中如何根据Enum字段对一组对象进行排序

ios - 黑屏出现在呈现的 View Controller 下方

android - Retrofit 从服务器哪里拉取数据?

java - 调用 getter 方法时出现 NullPointerException

javascript - 如何使用委托(delegate)事件?

c# - 未知类型的 CreateDelegate

使用 Kotlin 的 Android Joda-Time

android - 如何在 Android 中使用来自 Bitcoinj 的 NativeSecp256k1 包装器?