不是一个封闭类Java。

412

我正在尝试制作俄罗斯方块游戏,但在创建对象时遇到编译器错误

Shape不是一个封闭类

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

我正在为每个形状使用内部类。这是我的一部分代码。
public class Shapes {
    class AShape {
    }
    class ZShape {
    }
}

我做错了什么?


192
new Shape().new ZShape(); 这段代码需要一个外部实例来实例化 ZShape 类。 - Sotirios Delimanolis
4
将内部类移动到单独的文件中。 - Dimmduh
在这种情况下,@Dimmduh的评论应该是答案。它们不应该是内部类。将它们移动将识别出存在的Shape类的其他问题。 - Jeremiah Adams
不在这里回答问题,但我可以建议在这里使用_继承_,其中AShapeZShape扩展了基类Shapes。嵌套类对于这个问题来说并不是一个很好的设计。 - Paramvir Singh Karwal
12个回答

1

一开始阅读被接受的答案时,我没有意识到将内部类设置为静态与将其移动到自己的单独类中基本相同。

因此,在出现错误时

xxx不是一个封闭类

您可以通过以下任一方式解决:

  • 在内部类中添加static关键字,或者
  • 将其移到自己的单独类中。

-1

如果有人在尝试实例化第三方组件时遇到此问题。

我的情况是在使用此组件进行单元测试:ChannelSftp.LsEntry

通常的实例化给我带来了问题: enter image description here

解决方法如下:

    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);

我在这里找到了原始代码here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接