如何申报科特林LAMBDA与一个java调用者返回类型“无效”?

CHRISS:

我有一个完全写在科特林包括它的公共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访问这样的科特林代码(或什么来我的心)这样的情况一样。

基本上,这取决于哪一方你真的想触摸/增强只是为了得到你所需要的。

加强科特林代码来支持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.INSTANCEnull,但如果我有更多的方法来调用我可能会选择第二个($(...))方法。在最好的情况下,我只需要供应(产生?;-))等同一次,在几个项目而提供使用它们default的接口只是对Java变种可能会需要更多的方式工作,甚至可能会混淆一些人...

最后:没有...我不知道,让你有类似的任何选项的void官能化接口(/消费者)出的Unit科特林的-returning功能接口。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我要在一个空科特林功能,从Java调用时,并没有返回null Unit.INSTANCE?

在科特林XOR运算功能或一个错误?

是否有一个相当于科特林Java的Collections.synchronizedList的?或者这是不是需要科特林

是可以安全使用科特林属性访问语法来设置一个Java领域

如何调用写在科特林类的功能,在Java?

有没有申报的Java方法中缀了科特林方式

如何声明与一个java调用者返回类型“无效”一科特林功能?

如何基于功能接口科特林一个Java的拉姆达转换?

为什么从Java调用科特林对象时,我们得到了一个奇怪的方法叫什么名字?

如何创建一个科特林MVVM实体类

为什么lambda表达式需要在Android的科特林一个显式的回报?

如何检查如果一个类已经重写从科特林或Java使用反射的接口的默认方法?

如何为Base64解码在科特林/ Java的一个numpy的阵列(Python)的?

建设有一个摇篮+科特林的Java项目9

从Java调用一个科特林高阶函数

如何通过一个科特林集合作为varagrs?

实例化一个具体的Java类,它的用途在科特林递归仿制药

冗余SAM-构造不能消除对科特林声明的函数,但Java的作品申报功能

科特林 - 无法使用“T”作为具体化类型参数。使用一个类来代替

从一个公共方法的Java类继承在接受一个科特林级保护

如何创建一个固定大小IntArray后来在科特林初始化数组?

如何在科特林申报原料类型?

从科特林的lambda隐式返回

完成一个异步调用后,将响应返回给调用者

如何创建类型为((KeyboardEvent)-> dynamic)的lambda?在科特林

如何在科特林四舍五入一个数字

调用另一个函数并使其直接返回到这个函数的调用者

如何调用作为另一个函数结果的特定命名参数?科特林

如何调用作为另一个函数结果的特定命名参数?科特林