Общий расширяющийся класс И реализует интерфейс в 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.