用Java的类委托调用Kotlin对象作为静态方法

这可能有点难以描述,所以我会试着举一个我想要做的具体事例。

假设我们有一个Facade接口和类(在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,我们有班级代表,让我可以这样写:

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

这真是太棒了 – 没有更多的样板,我可以像Kotlin类一样调用SingletonKt 就像我调用java Singleton

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

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

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

我知道@JvmStatic注释,但唯一的地方,我可以把它放在SingletonKt文件,而不会导致编译错误是在FacadeInterface之前,它似乎并没有伎俩。

有没有办法设置这个类委托,以便我可以从Java调用它,就好像它是一个静态方法,而不介绍为SingletonKt创建代理方法(这将打败类委托的目的)的样板?