0

Java クラス内に内部インターフェースを持つことができる、またはできない理由はありますか? (内部クラスのように)。Google で決定的な答えを見つけることができませんでしたが、内部クラスと同じ方法でインターフェイスを埋め込むことはできないようです。私の推測では、Java の作成者はそれを可能にする大きな理由を理解していなかったので、そうではありませんが、本当に正当な理由があるのでしょうか?

たとえば、これをコンパイルできません (すべて 1 つの大きなクラスです)。

package buttonGetSourceObject;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ClassWithButton implements ActionListener, ButtonOwner{

    private String objectName = "";

    public ClassWithButton(String string) {
        objectName = string;
        JFrame f = new JFrame();
        JPanel p = new JPanel();
        MyJButton b = new MyJButton(this,"Press This Button for Name of Owner of Button");
        b.addActionListener(this);
        f.add(p);
        p.add(b);
            f.pack();
        f.setVisible(true);


    }

    public static void main(String[] args){
        ClassWithButton c = new ClassWithButton("object1name");
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        ((ButtonOwner)((MyJButton)arg0.getSource()).getOwner()).printInstanceName();

    }


    public interface ButtonOwner {
        public void printInstanceName();
    }


    private class MyJButton extends JButton {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        Object owner = null;

        public Object getOwner() {
            return owner;
        }

        public void setOwner(Object owner) {
            this.owner = owner;
        }

        public MyJButton(Object o, String string){
            owner = o;
            this.setText(string);
        }
    }


   @Override
    public void printInstanceName() {

        System.out.println(this);

    }

    public String getObjectName() {
        return objectName;
    }

    public void setObjectName(String objectName) {
        this.objectName = objectName;
    }

    public String toString(){
        return this.getObjectName();
    }

} //end

コンパイラは、内部インターフェイス「ButtonOwner」が存在することをまったく認識していないようです

4

2 に答える 2

6

これは内部クラスであるため、拡張するクラスの完全な名前を使用する必要があります (たとえばClassWithButton.ButtonOwner、単に の代わりに使用しますButtonOwner)。

public class ClassWithButton implements ActionListener, ClassWithButton.ButtonOwner

ただし、内部インターフェイスを拡張しているため、これは機能しません。

サイクルが検出されました: タイプ ClassWithButton は、それ自体または独自のメンバー タイプの 1 つを拡張/実装できません

クラスが内部インターフェースを実装できない理由について、上記の質問に対するコメントは、次の理由が考えられることを示しています。

クラスローディングの仕組み。他のクラスへの通常の参照は遅延ロードされますが、外部クラス、スーパークラス、および実装されたインターフェースは、クラス自体がロードされる前に自動的にロードされます。外部クラスが内部インターフェイスを実装し、その構成が有効である場合、実行時にクラスをロードするときにクラスローダーで StackOverflowError を取得します...

于 2013-06-08T04:43:56.387 に答える