Kelas perluasan generik DAN mengimplementasikan antarmuka di Kotlin

90

Katakanlah saya menginginkan variabel tipe, T, yang memperluas kelas tertentu dan mengimplementasikan antarmuka. Sesuatu seperti:

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

Apa sintaks untuk ini di Kotlin?

frenchdonuts.dll
sumber

Jawaban:

186

Hanya satu batas atas yang dapat ditentukan di dalam tanda kurung sudut.

Kotlin menawarkan sintaks yang berbeda untuk batasan umum jika ada lebih dari satu batasan:

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

dan untuk fungsi:

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

Itu didokumentasikan di sini .

hotkey
sumber
3
Apakah ada cara untuk menggunakannya untuk jenis kesenangan parametr, misalnya, fun foo (arg: ClassType, InterfaceType) {}? Tanpa menambahkan parameter tipe ke kelas
Ufkoku
1
@Ufkoku, tidak, tidak ada cara untuk melakukannya: tidak ada tipe persimpangan di Kotlin, dan parameter umum hanya dapat dideklarasikan secara eksplisit.
hotkey
1
@hotkey Saya memiliki fungsi di bawah ini: fun <T> wrapClientListener(listener: RemoteController.OnClientUpdateListener): T where T : RemoteController.OnClientUpdateListener, T : NotificationListenerService. Saya tidak peduli dengan tipe T. Tapi saat saya memanggil metode ini, Kotlin menanyakan tipe spesifiknya. Jadi bagaimana saya bisa memanggil metode ini?
leimenghao