4

Interface Readerを提供することで機能を定義する抽象ラッピングクラスFooがあります。別のリーダーを実装して提供すると、すべてうまくいきます。内部クラスを介してこれを行おうとすると、うまくいきません。Reader の実装を内部クラスに持つことは、私にとって必須です。

public abstract class Foo
    {
        private Reader reader;

        public Foo(Reader reader)
        {
            this.reader = reader;
        }

        public void read()
        {
            this.reader.doit();
        }
    }

「何らかの中間コンストラクター呼び出しのため、タイプ MapLink の囲んでいるインスタンスは使用できません」

public class ReaderFoo extends Foo
{
    public class FooReader implements Reader
    {
        @Override
        public void doit()
        {
            // functionality
        }
    }   

    public ReaderFoo ()
    {
        super(new FooReader());
    }
}

私は何を間違っていますか?

4

2 に答える 2

4

作ってみてくださいFooReader staticJava の内部クラスは、 staticでない限り、クラスではなく外部のインスタンスにバインドされます。

public class ReaderFoo extends Foo
{
    public static class FooReader implements Reader
    {
        @Override
        public void doit()
        {
            // functionality
        }
    }   

    public ReaderFoo ()
    {
        super(new FooReader());
    }
}

Readerの実際の型は のようになるため、実際にインスタンスを持つ前にインスタンスの内部クラスを使用することはできませんmyInstance.Reader

于 2013-05-31T09:46:17.317 に答える
3

問題は、コンストラクターがその前にFooReader外側のクラス ( ReaderFoo) をインスタンス化する必要があることです (内側のクラスはそれらを含むインスタンスへの参照を格納するため) が、コンストラクターReaderFoo. ニワトリが先か卵が先かの問題です。

于 2013-05-31T09:47:07.713 に答える