![](/img/trans.png)
[英]Can't omit default params when call Kotlin's function from Java in Android project
[英]Can't call Kotlin's extension property from java
Android Studio 3.4
这是我的科特琳课:
open class DefaultRestClientCallback<T> : Callback<T> {
val Response<*>.errorResponse: ErrorResponse
get() = ErrorUtils.parseError(this)
override fun onResponse(call: Call<T>, response: Response<T>) {
如您在这里看到的,我具有属性扩展名:
errorResponse
在另一个Kotlin类(Test.kt)中,我这样称呼:
class Test {
fun test() {
TransportService.login("email",
"pass", object : DefaultRestClientCallback<JsonElement>() {
override fun onTangoResponse(response: Response<*>) {
val isSuccessful = response.isSuccessful
if (isSuccessful) { // code >= 200 && code < 300;
} else {
val errorResponse = response.errorResponse
}
}
})
}
}
很好,一切正常。
现在,我需要从java文件中调用extension属性( 目前暂时无法将其转换为Kotlin )。 我尝试这样:
TransportService.login("email", "pass", new DefaultRestClientCallback<JsonElement>() {
@Override
public void onTangoResponse(@NotNull Response<?> response) {
boolean isSuccessful = response.isSuccessful();
if (isSuccessful) { // code >= 200 && code < 300;
} else {
ErrorResponse errorResponse = response.errorResponse();
}
}
});
}
但是我在这行得到编译错误:
ErrorResponse errorResponse = response.errorResponse();
错误:
Cannot resolve method 'errorResponse()'
Kotlin将扩展属性编译为静态方法。 这是在名为StringUtils.kt
的文件中扩展String
类的示例:
val String.greeting
get() = "hello $this"
因此,这是一种非常简单的方法,当在kotlin中调用"fred".greeting
类的方法时,将返回hello fred
。
如果检查kotlin字节码并在IDE中对其进行反编译,则可以看到结果类似于:
public final class StringUtilsKt {
@NotNull
public static final String getGreeting(@NotNull String $this$greeting) {
Intrinsics.checkParameterIsNotNull($this$greeting, "$this$greeting");
return "hello " + $this$greeting;
}
}
类StringUtilsKt
静态方法。 这意味着您可以简单地从Java像StringUtilsKt.getGreeting("fred")
那样调用它,这将导致相同的输出。
PS:这与扩展功能非常相似。 它们也被编译成静态方法,但是名称通常不会改变。
反编译Kotlin的字节码后,我得到以下信息:
@NotNull
public final ErrorResponse getErrorResponse(@NotNull Response $this$errorResponse) {
Intrinsics.checkParameterIsNotNull($this$errorResponse, "$this$errorResponse");
ErrorResponse var10000 = ErrorUtils.parseError($this$errorResponse);
Intrinsics.checkExpressionValueIsNotNull(var10000, "ErrorUtils.parseError(this)");
return var10000;
}
所以从Java我可以这样调用:
@Override
public void onTangoResponse(@NotNull Response<?> response) {
boolean isSuccessful = response.isSuccessful();
if (isSuccessful) { // code >= 200 && code < 300;
} else {
ErrorResponse errorResponse = getErrorResponse(response);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.