Bagaimana cara membuat instance kelas anonim kelas abstrak di Kotlin?

114

Asumsikan itu KeyAdapteradalah kelas abstrak dengan beberapa metode yang dapat diganti.

Di java saya bisa melakukan:

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

Bagaimana melakukan hal yang sama di Kotlin?

Tvaroh
sumber
1
Saya tidak memberi suara negatif, tetapi pertanyaan Anda menunjukkan upaya penelitian yang sangat sedikit. Pencarian Google sederhana untuk kelas anonim di kotlin muncul halaman ini yang membahas - dari semua hal - cara membuat analog Kotlin ke kelas dalam anonim.
Ted Hopp
5
Saya juga baru mulai dengan Kotlin. Pertanyaan ini muncul sebagai hit pertama dengan pencarian google yang sangat wajar. Apa yang sangat membingungkan bagi saya adalah bahwa KeyAdapter dalam pertanyaan tersebut kemungkinan besar adalah java.awt.event.KeyAdapter, yang merupakan kelas abstrak dengan 3 metode dan sederhana val k: KeyAdapter = KeyAdapter { println("Hello, world!") }tidak akan berfungsi. (Namun saya sedang mencari sintaks lambda.) Saya pikir saya akan mencari pertanyaan lain dengan judul yang tepat ini, tetapi pertanyaan yang dirumuskan lebih baik dan tautkan yang ini dengan komentar ...
Peter Lamberg
@PeterLamberg itu bukan java.awt itu adalah API plugin Intellij.
Tvaroh
Pertanyaan ini muncul sebagai hit pertama di beberapa pencarian google yang pertanyaan relevannya lebih dekat dengan ini jadi saya membahasnya di sini
Peter Lamberg
12
Saya tidak mengerti mengapa ini ditandai sebagai terlalu sederhana. Pertanyaannya banyak disukai, artinya banyak orang menghadapi masalah ini. Karena perbedaan bahasa, tidak jelas apakah klik pertama di Google adalah solusinya. Saya membaca sekilas dokumentasi resmi tetapi pertanyaan tentang SO ini menyelesaikannya.
Muz

Jawaban:

178

Dari dokumentasi bahasa resmi Kotlin :

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

Diterapkan untuk masalah Anda yang dihadapi:

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

Seperti yang telah ditunjukkan oleh Peter Lamberg - jika kelas anonim sebenarnya merupakan implementasi dari antarmuka fungsional ( bukan dari kelas abstrak ), Konversi SAM dapat digunakan untuk menyederhanakan pernyataan ini lebih jauh:

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

Perhatikan juga diskusi ini tentang perbedaan penggunaan antarmuka yang ditentukan di Java dan Kotlin.

Michael Lang
sumber