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 API:完美
- Kotlin 访问:完美
- Java 访问:
- 自动生成的参数类型,如 Function1(对于 Java 8 lambda 来说不是大问题)
- 详细
return Unit.INSTANCE; 而不是 void 返回。
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 访问:如果使用正确的方法,那就完美了。自动完成也建议使用详细方法。
- Java 访问:完美。由于
JvmSynthetic注解,自动补全不建议函数类型方法
class KotlinApi {
interface Listener {
fun onResponse(response: String)
}
fun demo(listener: Listener) {
demo { response ->
listener.onResponse(response)
}
}
@JvmSynthetic //Prevents JVM to use this method
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);
});
}