Je convertis une partie de mon code Java en Kotlin et je ne comprends pas très bien comment instancier les interfaces définies dans le code Kotlin. A titre d'exemple, j'ai une interface (définie en code Java):
public interface MyInterface {
void onLocationMeasured(Location location);
}
Et puis plus loin dans mon code Kotlin, j'instancie cette interface:
val myObj = new MyInterface { Log.d("...", "...") }
et cela fonctionne très bien. Cependant, lorsque je convertis MyInterface en Kotlin:
interface MyInterface {
fun onLocationMeasured(location: Location)
}
J'obtiens un message d'erreur: Interface MyListener does not have constructors
lorsque j'essaye de l'instancier - bien qu'il me semble que rien n'a changé sauf la syntaxe. Est-ce que je comprends mal comment les interfaces fonctionnent dans Kotlin?
Location -> Unit
) au lieu d'interfaces à méthode unique si possible - est-ce exact?La meilleure solution est d'utiliser des typealias à la place de votre interface Java
typealias MyInterface = (Location) -> Unit
Enregistrez-le comme ceci:
ou même plus propre
Invoquez-le comme ceci:
Les 3 options actuelles semblent être:
Lors de la conversion de nos bibliothèques vers Kotlin, nous avons en fait laissé toutes les interfaces en code Java, car il était plus facile d'appeler Java depuis Kotlin que Kotlin depuis Kotlin.
la source
Essayez d'accéder à votre interface comme ceci:
la source
si vous avez une classe Java comme celle-ci:
vous devez convertir ce code de Java en Kotlin comme ceci:
convertir l'interface Java :
au style d' interface Kotlin :
la source
Si l'interface est destinée à une méthode d'écoute d'une classe, remplacez la définition d'interface par le type de fonction. Cela rend le code plus concis. Voir ce qui suit.
Classe contenant la définition d'écouteur
Une autre classe
la source
la source