Javaでのインターフェース定義は、何よりも契約または約束のように考えることができます。インターフェースを実装すると主張することにより、クラスは、その中で定義されたメソッドの実装を持つことを約束します。たとえば、実装するクラスは、何も返さず、オブジェクトをメソッドに渡す必要がActionListener
あるメソッドの実装を提供することを約束します。actionPerformed
ActionEvent
メソッドが他のクラスによって呼び出された場合にのみ、ActionEvent
オブジェクトが存在して渡される必要があります。インターフェイス定義およびクラスの実装では、単にActionEvent
渡されることを前提としています。これですべてです。これは、パラメーターを受け取る他のメソッドとまったく同じです。呼び出し元は問題のデータを提供する必要があり、メソッドは単にそれを利用します。
なぜactionPerformed
が必要なのかについては、 ActionEvent
2つの異なるレベルで答えることができます。
- のインターフェイス定義で
ActionListener
は、正確なメソッドシグネチャを要求することでそれを義務付けているためです。(これは「私がしないとなぜコンパイルされないのか」という答えです。)
- インターフェイスを作成したJavaAPI設計者は、それがインターフェイスの動作方法であると判断したためです。(「アクションイベント」をリッスンすることになっているので、それは理にかなって
ActionListener
います。したがって、アクションイベントの情報を持つオブジェクトが渡されるのは当然です。提供された情報に基づいて行動するのは実装クラスの責任です。これは「なぜ彼らはそれをこの特定の方法にしたのか」と答えます。)
このすべてのポイントは何ですか?答えはポリモーフィズムです。の場合、異なる実装ActionListener
のグループ全体をActionListeners
Swingコンポーネントに登録することが可能であり、それらすべてがメソッドを持つことが保証されているため、すべて同じ方法で呼び出すことができますvoid actionPerformed(ActionEvent e)
。つまり、Swingコンポーネントは、実装(その動作が実際にどのように機能するか、および/またはそれを呼び出す方法)ではなく、各リスナーのインターフェイス(動作が期待されるもの)のみを考慮することができます。