Làm cách nào để tạo một thể hiện của lớp trừu tượng ẩn danh trong Kotlin?


113

Giả sử rằng đó KeyAdapterlà một lớp trừu tượng với một số phương thức có thể được ghi đè.

Trong java tôi có thể làm:

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

Làm thế nào để làm điều tương tự trong Kotlin?


1
Tôi không phản đối, nhưng câu hỏi của bạn cho thấy rất ít nỗ lực nghiên cứu. Một tìm kiếm đơn giản của Google cho các lớp ẩn danh trong kotlin sẽ xuất hiện trang này thảo luận - về tất cả mọi thứ - cách tạo tương tự Kotlin cho một lớp ẩn danh bên trong.
Ted Hopp

5
Tôi cũng mới bắt đầu với Kotlin. Câu hỏi này xuất hiện như một cú đánh đầu tiên với một tìm kiếm google rất hợp lý. Điều rất khó hiểu đối với tôi là KeyAdapter trong câu hỏi rất có thể là java.awt.event.KeyAdapter, là một lớp trừu tượng với 3 phương thức và val k: KeyAdapter = KeyAdapter { println("Hello, world!") }sẽ không hoạt động đơn giản . (Tuy nhiên tôi đang tìm kiếm cú pháp lambda.) Tôi nghĩ rằng tôi sẽ tìm kiếm anoter câu hỏi với danh hiệu này chính xác, nhưng một câu hỏi được xây dựng tốt hơn và liên kết này để nó với một bình luận ...
Peter Lamberg

@PeterLamberg nó không phải java.awt mà nó là API của các plugin Intellij.
Tvaroh

Câu hỏi này đi lên như một hit đầu tiên trong một số tìm kiếm google mà các câu hỏi có liên quan là ngày càng tiến tới vì vậy tôi linkin nó ở đây
Peter Lamberg

12
Tôi không hiểu tại sao điều này được gắn cờ là quá đơn giản. Câu hỏi được ủng hộ rất nhiều, có nghĩa là rất nhiều người gặp phải vấn đề này. Do sự khác biệt về ngôn ngữ, không rõ liệu lần đầu tiên trên Google có phải là giải pháp hay không. Tôi đã đọc lướt qua tài liệu chính thức nhưng câu hỏi này trên SO đã giải tỏa nó.
Muz

Câu trả lời:


177

Từ tài liệu ngôn ngữ Kotlin chính thức :

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

Đã áp dụng cho vấn đề của bạn trong tầm tay:

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

Như Peter Lamberg đã chỉ ra - nếu lớp ẩn danh thực sự là một triển khai của giao diện chức năng ( nghĩa là không phải của một lớp trừu tượng ), thì Chuyển đổi SAM có thể được sử dụng để đơn giản hóa câu lệnh này hơn nữa:

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

Cũng xin lưu ý thảo luận này về cách sử dụng khác nhau của các giao diện được định nghĩa trong Java và Kotlin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.