如何为Java调用者声明返回类型为“ void”的Kotlin函数?

时间:2018-12-06 13:19:41

标签: java kotlin

我有一个完全用Kotlin编写的库,包括其公共API。现在该库的用户使用Java,这里的问题是返回类型为Unit的Kotlin函数没有被编译为返回类型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函数,以便编译器生成voidVoid方法?

3 个答案:

答案 0 :(得分:3)

Voidvoid都可以工作,您只需要跳过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 reference guide 'Calling Kotlin from Java'并未真正提及它,但Unit documentation却做到了:

  

此类型与Java中的void类型相对应。

我们知道,以下两个是等效的:

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

答案 1 :(得分:0)

我使用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 ) ) ;

答案 2 :(得分:0)

示例:

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

        Thread.sleep(1000);
    }

    return null as Void;

}