Generyczna klasa rozszerzająca AND implementuje interfejs w Kotlin

86

Powiedzmy, że chcę zmienną typu T, która rozszerza określoną klasę i implementuje interfejs. Coś jak:

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

Jaka jest składnia tego w Kotlinie?

Frenchdonuts
źródło

Odpowiedzi:

179

W nawiasach ostrych można określić tylko jedną górną granicę.

Kotlin oferuje różną składnię dla ogólnych ograniczeń, gdy istnieje więcej niż jedno ograniczenie:

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

a dla funkcji:

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

Jest to udokumentowane tutaj .

Klawisz skrótu
źródło
3
Czy istnieje sposób, aby użyć go jako parametru typu fun, na przykład fun foo (arg: ClassType, InterfaceType) {}? Bez dodawania parametru typu do klasy
Ufkoku
1
@Ufkoku, nie, nie da się tego zrobić: w Kotlin nie ma typów przecięć, a parametry ogólne można zadeklarować tylko jawnie.
skrót klawiszowy
@hotkey Mam funkcji poniżej: fun <T> wrapClientListener(listener: RemoteController.OnClientUpdateListener): T where T : RemoteController.OnClientUpdateListener, T : NotificationListenerService. Nie obchodzi mnie typ T. Ale kiedy nazywam tę metodę, Kotlin pyta o konkretny typ. Jak więc mogę wywołać tę metodę?
leimenghao