7

なぜこれが許可されているのか、私は困惑しています

public class Foo {
    class Bar extends Foo {
    }
}

それでもこれは許されない

public class Foo {
    class Bar extends Foo {
    }

    class Fooey extends Bar {
    }
}

コンパイラは、スーパータイプ コンストラクターが呼び出される前に Fooey.this を参照できないことを通知しました。

そして、これは許可されています

public class Foo {
    static class Bar extends Foo {
    }

    class Fooey extends Bar {
    }
}

ここで何が起こっているのですか?また、内部クラスの継承がどのように機能するかについての詳細情報はどこで入手できますか?

編集かなり貧弱なアイデアの両方に出くわしました。内部クラスは外部クラスを拡張し、内部クラスは他の静的内部クラスを拡張します。正確に何が起こっているのか、これをどのようにリファクタリングする必要があるのか​​ わかりませんでした。最終的には、内部クラスをヤンクアウトして外部クラスにカプセル化しました。

4

4 に答える 4

6

まず第一に:この種のことをしないでください。それは悪です。実際、Java 1.1は、IMOという非常に限定的に指定されるべきでした。

コンストラクターthisからどちらを使用するかについて混乱があります。Foo.Fooey外側のthis(Foo.this)は機能します。しかし、実際thisはですが、スーパーコンストラクターが戻る前にFoo使用することに関するルールのために、スーパーコンストラクターに渡すことはできませんthis(さらに、外部インスタンスを内部インスタンスと同じインスタンスにすることに加えて)。スーパークラス""(IIRC)の外側のthis((Bar)this).this$0も、使用制限のためアクセスできませんthis

解決策は明示的であることです。明示的は通常、私の本では良いことです(定型文にならない限り)。

public class Foo {
    class Bar extends Foo {

    }

    class Fooey extends Bar {
        Fooey() {
            Foo.this.super();
        }
    }
}

さらに良いことに、内部クラスがそれ自体の外部クラスを拡張したり、内部クラスを拡張したりしないでください。

于 2009-10-19T16:24:25.017 に答える
1

JLSとこの質問への回答が出発点だと思います

Java 内部クラスと static ネストされたクラス

内部クラスとそれを囲むインスタンス

于 2009-10-19T16:05:44.883 に答える
1

トム・ホーティンの答えは正しいです。

Java puzzlerもご覧ください。サンプルの章には、このケースと、あなたが見たいかもしれない他のいくつかの「興味深い」ケースが含まれています。

于 2009-10-19T16:44:37.940 に答える
1

(まだコメントできません - 50 人の担当者が必要です)

これが許可されていることにも困惑しています。外部クラスの (非静的) 内部クラスは、実際にはその外部クラスのメンバーです。読み取り: 内部オブジェクトは外部オブジェクトのメンバーです。(ちなみに、すべての外部オブジェクトは内部オブジェクトを所有する必要がありますが、これは重要ではありません。)

私が好んで使用する類推は次のとおりです。Car外側のクラスを外側のクラスWheelに、内側のクラスを内側にします。のすべてのインスタンスは、メンバーとして のCarインスタンスを少なくとも 1 つ持つ必要があります。Wheel

現在、内部クラスが外部クラスを拡張することは概念的に意味がありません。オブジェクトがメンバーであり、別のオブジェクトのタイプである必要がある現実世界の状況は考えられません。集合論者は、規則性の公理とその帰結を思い出します。

次のように考えてください。extendHondaと、内部にネストされた内部クラスCarとします。ここであなたが言っているのは、すべてのオブジェクトオブジェクトであり (当然)、すべてのオブジェクトにはオブジェクトがあるということです。これらのステートメントの 1 つだけが意味を成しますが、Java では両方とも true にすることができます。HondaCarHonda CarCar Honda

または、前のアナロジーに戻ると、 aはaになり、定義により別の が必要になるため拡張Wheelせてなりませ。オブジェクトを構築すると、ネストされたオブジェクトの無限ループが発生します。CarWheelCarWheel Car WheelCar

これが合法であり、コンパイル時にエラーが発生しないことに腹を立てています。

于 2011-08-10T14:33:39.293 に答える