Kotlinで抽象クラスの匿名クラスのインスタンスを作成する方法は?


113

これKeyAdapterは、オーバーライドできるいくつかのメソッドを持つ抽象クラスであると想定します。

Javaでは私ができる:

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

Kotlinで同じことをするには?


1
私は反対票を投じなかったが、あなたの質問はほとんど研究努力を示さない。以下のためのシンプルなGoogle検索kotlinで匿名クラスアップターンこのページの匿名内部クラスにKotlinアナログを作成する方法-すべての物事の-について説明します。
Ted Hopp 2013

5
私もKotlinから始めています。この質問は非常に合理的なグーグル検索での最初のヒットとして出てきます。私にとって非常に混乱していたのは、問題のKeyAdapterがjava.awt.event.KeyAdapterである可能性が高いことです。これは3つのメソッドを持つ抽象クラスであり、単純な方法では機能しませんval k: KeyAdapter = KeyAdapter { println("Hello, world!") }。(ただし、ラムダ構文を探していました。)この正確なタイトルで注釈の質問を探しますが、より適切に定式化された質問にコメントを付けてリンクします...
Peter Lamberg

@PeterLambergこれはjava.awtではなく、IntellijプラグインAPIです。
Tvaroh 2016年


12
これが単純すぎると報告されている理由がわかりません。質問は非常に賛成されています。つまり、多くの人々がこの問題に直面しています。言語の違いにより、Googleへの最初のヒットが解決策であるかどうかは明らかではありません。私は公式文書をざっと読みましたが、SOに関するこの質問はそれを明確にしました。
ムズ

回答:


177

公式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.