การขยายคลาสทั่วไปและใช้อินเทอร์เฟซใน Kotlin


90

สมมติว่าฉันต้องการตัวแปรประเภท T ที่ขยายคลาสบางคลาสและใช้อินเทอร์เฟซ สิ่งที่ต้องการ:

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

ไวยากรณ์ของสิ่งนี้ใน Kotlin คืออะไร?

คำตอบ:


186

สามารถระบุขอบเขตด้านบนได้เพียงรายการเดียวเท่านั้นภายในวงเล็บมุม

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) {} โดยไม่ต้องเพิ่มพารามิเตอร์ type ในคลาส
Ufkoku

1
@Ufkoku ไม่ไม่มีทางทำได้: ไม่มีสี่แยกประเภทใน Kotlin และพารามิเตอร์ทั่วไปสามารถประกาศได้อย่างชัดเจนเท่านั้น
ฮอต

1
@hotkey ฉันมีฟังก์ชั่นด้านล่าง: fun <T> wrapClientListener(listener: RemoteController.OnClientUpdateListener): T where T : RemoteController.OnClientUpdateListener, T : NotificationListenerService. ฉันไม่สนใจประเภทของ T แต่เมื่อฉันเรียกวิธีนี้ Kotlin จะถามถึงประเภทที่เฉพาะเจาะจง แล้วฉันจะเรียกวิธีนี้ได้อย่างไร?
leimenghao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.