如何为java调用程序声明返回类型为“void”的kotlin函数?

ljsrvy3e  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(362)

我有一个完全用kotlin编写的库,包括它的公共api。现在库的用户使用java,这里的问题是kotlin函数的返回类型是 Unit 未编译为返回类型 void . 结果是java端总是要为有效无效的方法返回unit.instance。这能避免吗?
例子:
kotlin接口

interface Foo{
  fun bar()
}

java实现

class FooImpl implements Foo{
   // should be public void bar()
   public Unit bar(){  
      return Unit.INSTANCE 
      // ^^ implementations should not be forced to return anything 
   }
}

有没有可能以不同的方式声明kotlin函数,以便编译器生成 void 或者 Void 方法?

omqzjyyz

omqzjyyz1#

两者 Void 以及 void 工作,你只需要跳过它 Unit ...
kotlin接口:

interface Demo {
  fun demoingVoid() : Void?
  fun demoingvoid()
}

实现该接口的java类:

class DemoClass implements Demo {

    @Override
    public Void demoingVoid() {
        return null; // but if I got you correctly you rather want to omit such return values... so lookup the next instead...
    }

    @Override
    public void demoingvoid() { // no Unit required...

    }
}

请注意,虽然kotlins参考指南“从java调用kotlin”并没有真正提到它,但是 Unit 文件包括:
此类型对应于 void 键入java。
正如我们所知,以下两个是等价的:

fun demo() : Unit { }
fun demo() { }
xiozqbni

xiozqbni2#

例子:

override fun doInBackground(vararg params: Void?):Void{
    for (i in 0 until 10) {

        Thread.sleep(1000);
    }

    return null as Void;

}
wqlqzqxt

wqlqzqxt3#

我使用java接口实现了一个简单的变体。
---在acallback.java中--

public interface ACallback<T> {
     void invoke( T data );
}

--在kotlin文件中

fun dostuff( arg: String , callback: ACallback<String> ) { 
   stuff();
   callback(arg) ; // yes 'invoke' from java 
}

---在java中----

doStuff( "stuff" , ( String arg) -> voidReturningFunction( arg ) ) ;

相关问题