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?

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 .


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.