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?

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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.