จะสร้างอินสแตนซ์ของคลาสนามธรรมที่ไม่ระบุชื่อใน Kotlin ได้อย่างไร


114

สมมติว่าKeyAdapterเป็นคลาสนามธรรมที่มีหลายวิธีที่สามารถลบล้างได้

ใน java ฉันสามารถทำได้:

KeyListener keyListener = new KeyAdapter() {
    @Override public void keyPressed(KeyEvent keyEvent) {
        // ...
    }
};

วิธีการทำเช่นเดียวกันใน Kotlin?


1
ฉันไม่ได้ลงคะแนน แต่คำถามของคุณแสดงให้เห็นถึงความพยายามในการค้นคว้าน้อยมาก การค้นหาโดย Google แบบง่ายๆสำหรับคลาสที่ไม่ระบุตัวตนใน kotlinจะเปิดหน้านี้ซึ่งจะกล่าวถึง - จากทุกสิ่ง - วิธีสร้างอะนาล็อก Kotlin เป็นคลาสภายในที่ไม่ระบุชื่อ
Ted Hopp

5
ฉันเพิ่งเริ่มต้นกับ Kotlin คำถามนี้เกิดขึ้นเป็น Hit แรกด้วยการค้นหาโดย Google ที่สมเหตุสมผล สิ่งที่ทำให้ฉันสับสนมากคือ KeyAdapter ในคำถามนั้นน่าจะเป็น java.awt.event.KeyAdapter ซึ่งเป็นคลาสนามธรรมที่มี 3 วิธีและวิธีที่ใช้val k: KeyAdapter = KeyAdapter { println("Hello, world!") }ไม่ได้ผล (อย่างไรก็ตามฉันกำลังมองหาไวยากรณ์แลมบ์ดา) ฉันคิดว่าฉันจะมองหาคำถาม anoter ที่มีชื่อที่แน่นอน แต่เป็นคำถามที่มีสูตรดีกว่าและเชื่อมโยงคำถามนี้เข้ากับความคิดเห็น ...
Peter Lamberg

@PeterLamberg ไม่ใช่ java.awt มันคือ Intellij plugins API
Tvaroh


12
ฉันไม่เห็นว่าเหตุใดจึงถูกตั้งค่าสถานะว่าง่ายเกินไป คำถามได้รับการโหวตเป็นจำนวนมากซึ่งหมายความว่าผู้คนจำนวนมากต้องเผชิญกับปัญหานี้ เนื่องจากความแตกต่างของภาษาจึงไม่ชัดเจนว่าการเข้าชมครั้งแรกใน Google เป็นวิธีแก้ปัญหาหรือไม่ ฉันอ่านเอกสารอย่างเป็นทางการ แต่คำถามนี้เกี่ยวกับ SO เคลียร์ได้
Muz

คำตอบ:


178

จากเอกสารภาษา Kotlin อย่างเป็นทางการ :

window.addMouseListener(object : MouseAdapter() { 
    override fun mouseClicked(e : MouseEvent) { 
    // ... 
}

นำไปใช้กับปัญหาของคุณ:

val keyListener = object : KeyAdapter() { 
    override fun keyPressed(keyEvent : KeyEvent) { 
    // ... 
} 

ดังที่ Peter Lamberg ได้ชี้ให้เห็น - หากคลาสที่ไม่ระบุตัวตนเป็นการนำอินเทอร์เฟซที่ใช้งานได้จริงมาใช้ ( เช่นไม่ใช่คลาสนามธรรม ) การแปลง SAMสามารถใช้เพื่อทำให้คำสั่งนี้ง่ายขึ้น:

val keyListener = KeyAdapter { keyEvent ->
    // ...
}

โปรดสังเกตการสนทนานี้เกี่ยวกับการใช้งานอินเทอร์เฟซที่แตกต่างกันที่กำหนดไว้ใน Java และ Kotlin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.