Общий расширяющийся класс И реализует интерфейс в Kotlin

86

Скажем, мне нужна переменная типа T, которая расширяет определенный класс и реализует интерфейс. Что-то типа:

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

Каков синтаксис для этого в Котлине?

французские пончики
источник

Ответы:

179

Внутри угловых скобок можно указать только одну верхнюю границу.

Kotlin предлагает другой синтаксис для общих ограничений, когда существует более одного ограничения:

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

и для функций:

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

Это задокументировано здесь .

горячая клавиша
источник
3
Есть ли способ использовать его для параметрического типа развлечения, например, fun foo (arg: ClassType, InterfaceType) {}? Без добавления параметра типа в класс
Уфкоку
1
@Ufkoku, нет, нет способа сделать это: в Kotlin нет типов пересечений, а общие параметры можно объявить только явно.
горячая клавиша
@hotkey У меня есть функция ниже: fun <T> wrapClientListener(listener: RemoteController.OnClientUpdateListener): T where T : RemoteController.OnClientUpdateListener, T : NotificationListenerService. Меня не волнует тип Т. Но когда я вызываю этот метод, Kotlin запрашивает конкретный тип. Итак, как я могу вызвать этот метод?
leimenghao