私はテトリスのゲームを作ろうとしています、そして私はコンパイラエラーを得ています
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 {
}
}
何がおかしいのですか?
ZShape
は静的ではないため、外部クラスのインスタンスが必要です。
最も簡単な解決策は、可能であればZShapeと任意のネストしたクラスをstatic
にすることです。
私もあなたができるように任意のフィールドをfinal
またはstatic final
にします。
RetailerProfileModelがメインクラスで、RetailerPaymentModelがその内部クラスであるとします。次のようにして、クラスの外部にInnerクラスのオブジェクトを作成できます。
RetailerProfileModel.RetailerPaymentModel paymentModel = new RetailerProfileModel().new RetailerPaymentModel();
その場合、あなたの内部クラスは外部クラスの非静的メンバーにアクセスできないので、私が提案するのは、非静的クラスを静的クラスに変換しないことです。
例:
class Outer
{
class Inner
{
//...
}
}
したがって、そのような場合は、次のようにすることができます。
Outer o = new Outer();
Outer.Inner obj = o.new Inner();
docs に書かれているように:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
場合によっては、親クラスのグローバル変数に依存するため、静的にはできない内部クラスの新しいインスタンスを作成する必要があります。そのような状況で、静的ではない内部クラスのインスタンスを作成しようとすると、not an enclosing class
エラーがスローされます。
質問の例を取り上げて、ZShape
クラスのグローバル変数が必要なためにShape
が静的にならない場合
どうやってZShape
の新しいインスタンスを作ることができますか?こうやって:
親クラスにゲッターを追加します。
public ZShape getNewZShape() {
return new ZShape();
}
このようにアクセスしてください。
Shape ss = new Shape();
ZShape s = ss.getNewZShape();
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();
}
}
私は同じ問題に遭遇しました。私はすべての内なるパブリッククラスのインスタンスを作成することによって解決しました。あなたの状況としては、私はあなたが内部クラス以外の継承を使用することをお勧めします。
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にアクセスしてください。
Parentクラスがシングルトンの場合は、次のようにしてください。
Parent.Child childObject = (Parent.getInstance()).new Child();
getInstance()
は親クラスのシングルトンオブジェクトを返します。
私が最初に認められた答えを読んだときに気付かなかったことの一つは、内部クラスを静的にすることはそれをそれ自身の別のクラスに移動することと基本的に同じことであるということでした。
したがって、エラーが発生したとき
xxxは親クラスではありません
次のいずれかの方法で解決できます。
static
キーワードを追加する質問からの要求を達成するために、クラスをインターフェースに入れることができます。
public interface Shapes {
class AShape{
}
class ZShape{
}
}
それから著者が以前に試したように使用します:
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
適切な「論理的」な解決策を探しているなら、fabric
デザインパターンを使うべきです