我有一个完全写在科特林包括它的公共API库。现在图书馆的用户使用Java,这里的问题是,随着返回类型科特林Lambda表达式Unit
不会被编译到返回类型void
。其效果是,Java端始终返回Unit.INSTANCE
对于那些用途不同方法void
。这能以某种方式避免?
例:
科特林LAMBDA
interface Foo{
fun bar(x:(String)->Unit)
}
Java调用
public void call(){
foo.bar(this::processString)
}
//the return type should rather be void instead of Unit
public Unit processString(String s){
return Unit.INSTANCE
// ^^ implementations should not be forced to return anything
}
是否有可能以不同的方式申报科特林LAMBDA所以编译器生成一个void
返回类型?
我没有一个真正的答案,但我会分享,我在哪里,我需要从Java访问这样的科特林代码(或什么来我的心)这样的情况一样。
基本上,这取决于哪一方你真的想触摸/增强只是为了得到你所需要的。
加强科特林代码来支持Java等价物:
interface Foo {
fun bar(x : (String) -> Unit)
/* the following is only here for Java */
@JvmDefault // this requires that you add -Xjvm-default=enable to your compiler flags!
fun bar(x:Consumer<String>) = bar(x::accept)
}
这有一些缺点:Consumer
-方法是可见的科特林以及,因此也可调用从那里。不用说,你需要复制的接口中的所有功能,因此你的整个科特林接口只得到更加臃肿。但是:它从双方的工作,你会期望的方式。Java调用的Consumer
-variant,科特林调用(String) -> Unit
-variant ...希望;-)实际上只是demoing一些电话:
// from Java:
..bar(s -> { System.out.println(s); })
// however, method references might not work that easily or not without a workaround...
..bar((Consumer<String>) System.out::println); // not nice... @JvmName("kotlinsBar") to the rescue? well... that will just get more and more ugly ;-)
// from Kotlin:
..bar(Consumer(::println)) // or: ..bar(Consumer { println(it) })
..bar(::println) // or: ..bar { println(it) } // whatever you prefer...
话虽说,另一种变体是添加辅助方法,实际上帮助从Java调用的科特林功能更容易,例如一些如下:
fun <T> `$`(consumer: Consumer<T>): (T) -> Unit = consumer::accept
这可能永远不会从科特林被调用(如写反引号与$组合已经够麻烦的),或者如果你不想你的臃肿的代码科特林只需添加这样的方法去渣,然而其中它看起来并不苗条:
static <T> Function1<T, Unit> $(Consumer<T> consumer) {
return t -> {
consumer.accept(t);
return Unit.INSTANCE;
};
}
调用这些方法看起来都一样:
..bar($(s -> /* do something with s */)) // where bar(x : (String) -> Unit)
对于事情我需要解决我刚回国Unit.INSTANCE
或null
,但如果我有更多的方法来调用我可能会选择第二个($(...)
)方法。在最好的情况下,我只需要供应(产生?;-))等同一次,在几个项目而提供使用它们default
的接口只是对Java变种可能会需要更多的方式工作,甚至可能会混淆一些人...
最后:没有...我不知道,让你有类似的任何选项的void
官能化接口(/消费者)出的Unit
科特林的-returning功能接口。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句