我有一个完全用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函数,以便编译器生成void
或Void
方法?
答案 0 :(得分:3)
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 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;
}