Kotlin 1.4及更高版本
Kotlin 1.4将通过“功能接口”解决此问题
Kotlin功能界面
- Kotlin API:完美
- Kotlin访问:完美
- Java访问:完美
class KotlinApi {
fun interface Listener {
fun onResponse(response: String)
}
fun demo(listener: Listener) {
listener.onResponse("response")
}
}
fun kotlinConsumer() {
KotlinApi().demo { response ->
println(response)
}
}
public static void javaConsumer(){
new KotlinApi().demo(response -> {
System.out.println(response);
});
}
在Kotlin 1.4之前
如果您希望Kotlin和Java都具有最佳访问体验,那么就没有唯一的最终解决方案。
如果Kotlin开发人员认为不必为Kotlin接口进行SAM转换,那么“ Kotlin接口”方法将是最终的解决方案。
https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
另外请注意,此功能仅适用于Java互操作。由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持。
为您的用例选择最佳的解决方案。
Kotlin函数类型
- Kotlin API:完美
- Kotlin访问:完美
- Java访问:
- 自动生成的参数类型,例如Function1(对于Java 8 lambda来说不是大问题)
- 详细
return Unit.INSTANCE;
而不是无效的回报。
class KotlinApi {
fun demo(listener: (response: String) -> Unit) {
listener("response")
}
}
fun kotlinConsumer() {
KotlinApi().demo { response->
println(response)
}
}
public static void javaConsumer() {
new KotlinApi().demo(response -> {
System.out.println(response);
return Unit.INSTANCE;
});
}
Kotlin界面
- Kotlin API:其他接口定义。
- Kotlin访问:太冗长
- Java访问:完美
class KotlinApi {
interface Listener {
fun onResponse(response: String)
}
fun demo(listener: Listener) {
listener.onResponse("response")
}
}
fun kotlinConsumer() {
KotlinApi().demo(object : KotlinApi.Listener {
override fun onResponse(response: String) {
println(response)
}
})
}
public static void javaConsumer() {
new KotlinApi().demo(response -> {
System.out.println(response);
});
}
Java介面
- Kotlin API:混合Java代码。
- Kotlin访问:有点冗长
- Java访问:完美
class KotlinApi {
fun demo(listener: Listener) {
listener.onResponse("response")
}
}
public interface Listener {
void onResponse(String response);
}
fun kotlinConsumer() {
KotlinApi().demo { response ->
println(response)
}
}
public static void javaConsumer() {
new KotlinApi().demo(response -> {
System.out.println(response);
});
}
多种方法
- Kotlin API:多种方法实现
- Kotlin Access:如果使用正确的方法,则是完美的。自动完成功能也建议使用详细方法。
- Java Access:完美。由于
JvmSynthetic
注释,自动完成不建议使用函数类型方法
class KotlinApi {
interface Listener {
fun onResponse(response: String)
}
fun demo(listener: Listener) {
demo { response ->
listener.onResponse(response)
}
}
@JvmSynthetic
fun demo(listener: (String) -> Unit) {
listener("response")
}
}
fun kotlinConsumer() {
KotlinApi().demo { response ->
println(response)
}
}
public static void javaConsumer() {
new KotlinApi().demo(response -> {
System.out.println(response);
});
}
Java API
- Kotlin API:没有Kotlin API,所有API代码都是Java
- Kotlin访问:完美
- Java访问:完美
public class JavaApi {
public void demo(Listener listener) {
listener.onResponse("response");
}
public interface Listener {
void onResponse(String response);
}
}
fun kotlinConsumer() {
JavaApi().demo { response ->
println(response)
}
}
public static void javaConsumer() {
new JavaApi().demo(response -> {
System.out.println(response);
});
}
(bytesUploaded: Long) -> Unit
。