如何为 java 调用者声明返回类型 'void' 的 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方法?

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...
}
}

请注意,虽然Kotlin参考指南"从Java调用Kotlin"并没有真正提到它,但Unit文档确实提到了:

此类型对应于Java中的void类型。

正如我们所知,以下两个是等价的:

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

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

示例:

override fun doInBackground(vararg params: Void?):Void{
for (i in 0 until 10) {
Thread.sleep(1000);
}
return null as Void;
}

最新更新