Classe de extensão genérica E implementa interface em Kotlin

86

Digamos que eu queira uma variável de tipo, T, que estenda uma determinada classe e implemente uma interface. Algo como:

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

Qual é a sintaxe para isso no Kotlin?

Frenchdonuts
fonte

Respostas:

179

Apenas um limite superior pode ser especificado dentro dos colchetes angulares.

Kotlin oferece sintaxe diferente para restrições genéricas quando há mais de uma restrição:

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

e para funções:

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

Está documentado aqui .

tecla de atalho
fonte
3
Existe alguma maneira de usá-lo para o tipo de diversão paramétrica, por exemplo, fun foo (arg: ClassType, InterfaceType) {}? Sem adicionar parâmetro de tipo à classe
Ufkoku
1
@Ufkoku, não, não há como fazer isso: não há tipos de interseção no Kotlin e os parâmetros genéricos só podem ser declarados explicitamente.
tecla de atalho
@hotkey Eu tenho uma função a seguir: fun <T> wrapClientListener(listener: RemoteController.OnClientUpdateListener): T where T : RemoteController.OnClientUpdateListener, T : NotificationListenerService. Eu não me importo com o tipo de T. Mas quando chamo esse método, Kotlin pergunta qual é o tipo específico. Então, como posso chamar esse método?
leimenghao