我试图做一个俄罗斯方块游戏,我得到了编译器错误

Shape不是一个外围类

当我尝试创建一个对象时

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

我为每个形状使用内部类。这是我的部分代码

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

我做错了什么?


当前回答

如果有人有这个问题,试图实例化第三方组件。

在我的情况下,我使用这个组件进行单元测试:ChannelSftp。LsEntry

做通常的实例化给我的问题:

解决方案是:

    ChannelSftp channelSftp =  new ChannelSftp();
    Constructor<ChannelSftp.LsEntry> constructor = (Constructor<ChannelSftp.LsEntry>) ChannelSftp.LsEntry.class.getDeclaredConstructors()[0];
    constructor.setAccessible(true);
    ChannelSftp.LsEntry lsEntry = constructor.newInstance(channelSftp, "file1.txt", null);

我在这里找到了原始代码

其他回答

如果有人有这个问题,试图实例化第三方组件。

在我的情况下,我使用这个组件进行单元测试:ChannelSftp。LsEntry

做通常的实例化给我的问题:

解决方案是:

    ChannelSftp channelSftp =  new ChannelSftp();
    Constructor<ChannelSftp.LsEntry> constructor = (Constructor<ChannelSftp.LsEntry>) ChannelSftp.LsEntry.class.getDeclaredConstructors()[0];
    constructor.setAccessible(true);
    ChannelSftp.LsEntry lsEntry = constructor.newInstance(channelSftp, "file1.txt", null);

我在这里找到了原始代码

ZShape不是静态的,所以它需要一个外部类的实例。

最简单的解决方案是使ZShape和任何嵌套类都是静态的。

我也会将任何字段设置为final或static final。

如文件所述:

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

我的建议是不要将非静态类转换为静态类,因为在这种情况下,内部类无法访问外部类的非静态成员。

例子:

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

所以,在这种情况下,你可以这样做:

Outer o = new Outer();
Outer.Inner obj = o.new Inner();
Shape shape = new Shape();
Shape.ZShape zshape = shape.new ZShape();