Impossible d'appeler la propriété d'extension de Kotlin depuis Java
Android Studio 3.4
Voici mon cours de kotlin :
open class DefaultRestClientCallback<T> : Callback<T> {
val Response<*>.errorResponse: ErrorResponse
get() = ErrorUtils.parseError(this)
override fun onResponse(call: Call<T>, response: Response<T>) {
comme vous pouvez le voir ici, j'ai une extension de propriété :
errorResponse
À partir d'une autre classe Kotlin (Test.kt), j'appelle ceci comme ceci :
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
}
}
})
}
}
Bien ça marche bien.
Maintenant, je dois appeler la propriété d'extension à partir du fichier java ( que je ne peux pas convertir en Kotlin pour le moment ). j'essaye ça :
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();
}
}
});
}
Mais j'obtiens une erreur de compilation dans cette ligne :
ErrorResponse errorResponse = response.errorResponse();
Erreur:
Cannot resolve method 'errorResponse()'
Kotlin compile les propriétés d'extension en méthodes statiques. Voici un exemple d'extension de la String
classe dans un fichier appelé StringUtils.kt
:
val String.greeting
get() = "hello $this"
Donc, une méthode très simple qui, lorsqu'elle est appelée dans kotlin "fred".greeting
, retournera hello fred
.
Si vous vérifiez le byte code kotlin et le décompilez dans l'IDE, vous pouvez voir que le résultat est similaire à :
public final class StringUtilsKt {
@NotNull
public static final String getGreeting(@NotNull String $this$greeting) {
Intrinsics.checkParameterIsNotNull($this$greeting, "$this$greeting");
return "hello " + $this$greeting;
}
}
Une méthode statique dans une classe StringUtilsKt
. Cela signifie que vous pouvez simplement l'appeler à partir de Java comme StringUtilsKt.getGreeting("fred")
et cela donnera le même résultat.
PS : C'est très similaire aux fonctions d'extension. Ils sont également compilés en méthodes statiques, mais le nom ne change généralement pas.