Impossible d'appeler la propriété d'extension de Kotlin depuis Java


Alexis

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()'
Fred

Kotlin compile les propriétés d'extension en méthodes statiques. Voici un exemple d'extension de la Stringclasse 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.

Articles connexes


Impossible d'appeler la fonction d'extension kotlin depuis java

Rahul Je sais que les fonctions d'extention kotlin sont compilées en tant que fonction statique en utilisant fileName comme nom de classe avec le suffixe Kt. Le problème est que ma fonction de paramètre String unique demande deux paramètres String lorsqu'elle

Impossible d'appeler la liste depuis la classe.

utilisateur10352799 Lorsque j'exécute le code, j'obtiens le message d'erreur : "AttributeError: type object 'Player' has no attribute 'hkslist'" Pourquoi ne puis-je pas appeler la liste depuis la classe ? L'idée est que la liste est censée choisir l'une des de

Impossible d'appeler la méthode depuis la classe

Testeur2019 J'ai une classe nommée test.cs : using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Support.PageObjects; using qa.WrapperFactory; namespace Common.PageObjects { public class Test { [Fin