web-dev-qa-db-ja.com

包含クラスのJavaではありません

私はテトリスのゲームを作ろうとしています、そして私はコンパイラエラーを得ています

Shape is not an enclosing class

オブジェクトを作成しようとしたとき

public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}

それぞれの形に内部クラスを使っています。これが私のコードの一部です

public class Shapes {
    class AShape {
    }
    class ZShape {
    }
}

何がおかしいのですか?

310
V Sebi

ZShapeは静的ではないため、外部クラスのインスタンスが必要です。

最も簡単な解決策は、可能であればZShapeと任意のネストしたクラスをstaticにすることです。

私もあなたができるように任意のフィールドをfinalまたはstatic finalにします。

444
Peter Lawrey

RetailerProfileModelがメインクラスで、RetailerPaymentModelがその内部クラスであるとします。次のようにして、クラスの外部にInnerクラスのオブジェクトを作成できます。

RetailerProfileModel.RetailerPaymentModel paymentModel = new RetailerProfileModel().new RetailerPaymentModel();
147
Vishal Kumar

その場合、あなたの内部クラスは外部クラスの非静的メンバーにアクセスできないので、私が提案するのは、非静的クラスを静的クラスに変換しないことです。

例:

class Outer
{
    class Inner
    {
        //...
    }
}

したがって、そのような場合は、次のようにすることができます。

Outer o = new Outer();
Outer.Inner obj = o.new Inner();
41
Amit Upadhyay

docs に書かれているように:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();
15
Brennan Miller

場合によっては、親クラスのグローバル変数に依存するため、静的にはできない内部クラスの新しいインスタンスを作成する必要があります。そのような状況で、静的ではない内部クラスのインスタンスを作成しようとすると、not an enclosing classエラーがスローされます。

質問の例を取り上げて、ZShapeクラスのグローバル変数が必要なためにShapeが静的にならない場合

どうやってZShapeの新しいインスタンスを作ることができますか?こうやって:

親クラスにゲッターを追加します。

public ZShape getNewZShape() {
    return new ZShape();
}

このようにアクセスしてください。

Shape ss = new Shape();
ZShape s = ss.getNewZShape();
10
M9J_cfALt
Shape shape = new Shape();
Shape.ZShape zshape = shape.new ZShape();

ネストしたクラスを静的にする必要はありませんが、パブリックにする必要があります。

public class Test {
    public static void main(String[] args) {
        Shape shape = new Shape();
        Shape s = shape.new Shape.ZShape();
    }
}
1
Younes

私は同じ問題に遭遇しました。私はすべての内なるパブリッククラスのインスタンスを作成することによって解決しました。あなたの状況としては、私はあなたが内部クラス以外の継承を使用することをお勧めします。

public class Shape {

    private String shape;

    public ZShape zShpae;
    public SShape sShape;

    public Shape(){
      int[][] coords =  noShapeCoords;
      shape = "NoShape";
      zShape = new ZShape();
      sShape = new SShape();
    }

    class ZShape{
      int[][] coords =  zShapeCoords;
      String shape = "ZShape";
    }

    class SShape{
      int[][] coords = sShapeCoords;
      String shape = "SShape";
    }

 //etc
}

そして、あなたは新しいShape()を使うことができます。そしてshape.zShapeを通してZShapeにアクセスしてください。

1
user655000

Parentクラスがシングルトンの場合は、次のようにしてください。

Parent.Child childObject = (Parent.getInstance()).new Child();

getInstance()は親クラスのシングルトンオブジェクトを返します。

1
CoDe

私が最初に認められた答えを読んだときに気付かなかったことの一つは、内部クラスを静的にすることはそれをそれ自身の別のクラスに移動することと基本的に同じことであるということでした。

したがって、エラーが発生したとき

xxxは親クラスではありません

次のいずれかの方法で解決できます。

  • 内部クラスにstaticキーワードを追加する
  • それを独自の別のクラスに移動します。
1
Suragch

質問からの要求を達成するために、クラスをインターフェースに入れることができます。

public interface Shapes {
    class AShape{
    }
    class ZShape{
    }
}

それから著者が以前に試したように使用します:

public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}

適切な「論理的」な解決策を探しているなら、fabricデザインパターンを使うべきです

0
Reishin