sourcecode

엔클로징 클래스 Java가 아닙니다.

copyscript 2022. 8. 19. 21:01
반응형

엔클로징 클래스 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 {
    }
}

내가 뭘 잘못하고 있지?

ZShape는 스태틱하지 않기 때문에 외부 클래스의 인스턴스가 필요합니다.

및 「ZShape」를 만드는 입니다.static네가 할 수 있으면.

.final ★★★★★★★★★★★★★★★★★」static final네, 그렇습니다.

Retailer Profile Model이 메인 클래스이고 Retailer Payment Model이 내부 클래스라고 가정합니다.다음과 같이 클래스 외부에 내부 클래스의 개체를 만들 수 있습니다.

RetailerProfileModel.RetailerPaymentModel paymentModel
        = new RetailerProfileModel().new RetailerPaymentModel();

이 경우 내부 클래스는 외부 클래스의 비 정적 멤버에 액세스할 수 없기 때문에 비 정적 클래스를 정적 클래스로 변환하지 않는 것이 좋습니다.

예:

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

이 경우 다음과 같은 작업을 수행할 수 있습니다.

Outer o = new Outer();
Outer.Inner obj = o.new Inner();

문서에 기재된 바와 같이:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

부모 클래스의 일부 글로벌 변수에 의존하기 때문에 스태틱할 수 없는 내부 클래스의 새 인스턴스를 만들어야 할 수 있습니다., 「」가 .not an enclosing class에러가 발생.

, '만약에'가 '만약에'?ZShape 수 .Shape 수업?

새로운 수 요?ZShape음음음같 뭇매하다

부모 클래스에 getter를 추가합니다.

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 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()를 사용하여 ZShape를 방문할 수 있습니다.zShape;

중첩된 클래스를 정적으로 만들 필요는 없지만 공개해야 합니다.

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

합격된 답을 읽을 때 내가 처음에 깨닫지 못한 것은 내부 클래스를 정적으로 만드는 것은 기본적으로 다른 클래스로 이동하는 것과 같다는 것이다.

따라서 오류가 발생했을 때

xxx가 포함된 클래스가 아닙니다.

이 문제는 다음 방법 중 하나로 해결할 수 있습니다.

  • , 그럼 여기에다가 더해져요.static클래스의 또는 inner 클래스의 키워드
  • 다른 클래스로 이동합니다.

부모 클래스가 싱글톤인 경우 다음 방법을 사용합니다.

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

서 ''는getInstance()는 부모 클래스의 싱글톤 개체를 반환합니다.

질문의 요건을 충족하기 위해 클래스를 인터페이스에 넣을 수 있습니다.

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

그런 다음 이전에 시도한 작성자로 사용합니다.

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

에는'논리적인해법'을.fabric 패턴

언급URL : https://stackoverflow.com/questions/20252727/is-not-an-enclosing-class-java

반응형