我正在尝试制作俄罗斯方块游戏而且我收到编译错误
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 {
}
}
我做错了什么?
答案 0 :(得分:448)
ZShape
不是静态的,因此需要外部类的实例。
最简单的解决方案是尽可能制作ZShape和任何嵌套类static
。
我还可以制作任何字段final
或static final
。
答案 1 :(得分:42)
我建议不要将非静态类转换为静态类,因为在这种情况下,你的内部类不能访问外部类的非静态成员。
示例:
class Outer
{
class Inner
{
//...
}
}
因此,在这种情况下,您可以执行以下操作:
Outer o = new Outer();
Outer.Inner obj = o.new Inner();
答案 2 :(得分:15)
如docs中所述:
private bool AllowAnonymousAccess(HttpRequestMessage request)
{
IHttpControllerSelector selector = GlobalConfiguration.Configuration.Services.GetHttpControllerSelector();
HttpControllerDescriptor descriptor = selector.SelectController(request);
Type controllerType = descriptor.ControllerType;
return controllerType.GetCustomAttribute<AllowAnonymousAttribute>(true) != null;
}
答案 3 :(得分:10)
有时,我们需要创建一个不能为静态的内部类的新实例,因为它依赖于父类的一些全局变量。在这种情况下,如果您尝试创建非静态内部类的实例,则会引发not an enclosing class
错误。
以问题为例,如果ZShape
不能是静态的,因为它需要Shape
类的全局变量,该怎么办?
如何创建ZShape
的新实例?这是如何:
在父类中添加一个getter:
public ZShape getNewZShape() {
return new ZShape();
}
像这样访问它:
Shape ss = new Shape();
ZShape s = ss.getNewZShape();
答案 4 :(得分:5)
Shape shape = new Shape();
Shape.ZShape zshape = shape.new ZShape();
答案 5 :(得分:1)
我遇到了同样的问题。 我通过为每个内部公共类创建一个实例来解决。 至于你的情况,我建议你使用内部类以外的继承。
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;
答案 6 :(得分:1)
无需将嵌套类设为静态类,但必须是公共的
public class Test {
public static void main(String[] args) {
Shape shape = new Shape();
Shape s = shape.new Shape.ZShape();
}
}
答案 7 :(得分:1)
如果父类是单身,请使用以下方式:
Parent.Child childObject = (Parent.getInstance()).new Child();
其中getInstance()
将返回父类单例对象。
答案 8 :(得分:1)
在阅读已接受的答案时,我最初没有意识到的一件事是,将内部类静态化与将其移动到自己的单独类中基本相同。
因此,在收到错误时
xxx不是封闭类
您可以通过以下任一方式解决此问题:
static
关键字添加到内部类,或答案 9 :(得分:0)
要达到问题的要求,我们可以将类放入接口:
::ng-deep .mat-horizontal-stepper-header-container {
display: none ;
}
,然后以以前尝试的作者身份使用:
public interface Shapes {
class AShape{
}
class ZShape{
}
}
如果我们正在寻找合适的“逻辑”解决方案,则应使用public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
设计模式