La classe di estensione generica E implementa l'interfaccia in Kotlin


90

Diciamo che voglio una variabile di tipo, T, che estenda una certa classe e implementi un'interfaccia. Qualcosa di simile a:

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

Qual è la sintassi per questo in Kotlin?

Risposte:


186

È possibile specificare un solo limite superiore all'interno delle parentesi angolari.

Kotlin offre una sintassi diversa per i vincoli generici quando c'è più di un vincolo:

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

e per le funzioni:

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

È documentato qui .


3
C'è un modo per usarlo per il tipo di parametr di divertimento, ad esempio, fun foo (arg: ClassType, InterfaceType) {}? Senza aggiungere il parametro di tipo alla classe
Ufkoku

1
@Ufkoku, no, non c'è modo di farlo: non ci sono tipi di intersezione in Kotlin e i parametri generici possono essere dichiarati solo esplicitamente.
hotkey

1
@hotkey Ho una funzione di seguito: fun <T> wrapClientListener(listener: RemoteController.OnClientUpdateListener): T where T : RemoteController.OnClientUpdateListener, T : NotificationListenerService. Non mi interessa del tipo di T. Ma quando chiamo questo metodo, Kotlin chiede il tipo specifico. Allora come posso chiamare questo metodo?
leimenghao
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.