La classe d'extension générique AND implémente l'interface dans Kotlin

86

Disons que je veux une variable de type, T, qui étend une certaine classe et implémente une interface. Quelque chose comme:

class Foo <T : Bar implements Baz> { ... }

Quelle est la syntaxe pour cela dans Kotlin?

Frenchdonuts
la source

Réponses:

179

Une seule limite supérieure peut être spécifiée à l'intérieur des chevrons.

Kotlin propose une syntaxe différente pour les contraintes génériques lorsqu'il y a plus d'une contrainte:

class Foo<T>(val t: T) where T : Bar, T : Baz { ... }

et pour les fonctions:

fun <T> f(): Foo where T : Bar, T : Baz { ... }

Il est documenté ici .

touche de raccourci
la source
3
Existe-t-il un moyen de l'utiliser pour un type de paramètre amusant, par exemple, fun foo (arg: ClassType, InterfaceType) {}? Sans ajouter de paramètre de type à la classe
Ufkoku
1
@Ufkoku, non, il n'y a aucun moyen de le faire: il n'y a pas de types d'intersection dans Kotlin, et les paramètres génériques ne peuvent être déclarés que explicitement.
raccourci clavier
@hotkey J'ai une fonction ci - dessous: fun <T> wrapClientListener(listener: RemoteController.OnClientUpdateListener): T where T : RemoteController.OnClientUpdateListener, T : NotificationListenerService. Je me fiche du type de T. Mais quand j'appelle cette méthode, Kotlin demande le type spécifique. Alors, comment puis-je appeler cette méthode?
leimenghao