Clase de extensión genérica E implementa la interfaz en Kotlin

86

Digamos que quiero una variable de tipo, T, que amplíe una determinada clase e implemente una interfaz. Algo como:

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

¿Cuál es la sintaxis de esto en Kotlin?

donuts franceses
fuente

Respuestas:

179

Solo se puede especificar un límite superior dentro de los corchetes angulares.

Kotlin ofrece una sintaxis diferente para restricciones genéricas cuando hay más de una restricción:

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

y para funciones:

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

Está documentado aquí .

tecla de acceso rápido
fuente
3
¿Hay alguna forma de usarlo para el tipo de parámetro de diversión, por ejemplo, fun foo (arg: ClassType, InterfaceType) {}? Sin agregar parámetro de tipo a la clase
Ufkoku
1
@Ufkoku, no, no hay forma de hacerlo: no hay tipos de intersección en Kotlin y los parámetros genéricos solo se pueden declarar explícitamente.
tecla
@hotkey Tengo una función a continuación: fun <T> wrapClientListener(listener: RemoteController.OnClientUpdateListener): T where T : RemoteController.OnClientUpdateListener, T : NotificationListenerService. No me importa el tipo de T. Pero cuando llamo a este método, Kotlin pregunta por el tipo específico. Entonces, ¿cómo puedo llamar a este método?
leimenghao