你能创建一个匿名 class 的 Java 数组吗?

Can you create a Java array of an anonymous class?

我想知道是否可以创建一个 Java 匿名数组 class。例如,我试试这个代码:

final var anonArray = new Object() {
    public String foo = "bar";
}[4];

然而,这给出了一个错误:error: array required, but <anonymous Object> found。这可能吗?

记住 new Object() {...} 给你的是一个值而不是类型。

因此,下面是创建匿名 classes 实例数组的方法:

final Object[] anonArray = new Object[]{
     new Object(){
        public String foo = "bar1";
     }, 
     new Object(){
        public String foo = "bar2";
     },
     new Object(){
        public String foo = "bar3";
     },
     new Object(){
        public String foo = "bar4";
     }
};

或者,如果您想要一个具有相同匿名 class 实例 4 次的数组:

final Object anonInstance = new Object(){
    public String foo = "bar1";
};
final Object[] anonArray = new Object[]{
     anonInstance, anonInstance, anonInstance, anonInstance
};

或者如果您想要同一个匿名的 4 个不同实例 class:

final Object[] anonArray = new Object[4];
for (int i = 0; i < anonArray.length; i++) {

    // Just to show we can do this ....
    final String bar = "bar" + 1;

    anonArray[i] = new Object(){
        public String foo = bar;  // Look!
    };
}

请注意,在以上所有内容中,数组类型都是 Object[] 而不是“Object 的匿名子数组 class”。很难想象这会很重要,但如果真的很重要,您将需要求助于反射来创建数组 class。 (参见@ernest_k的。)

或者只声明一个适当的自定义 class 或接口的数组,并从该 class / 接口创建匿名子 classes。 Object 的匿名子 class 不太实用 ...

语法 new Object() {} 创建匿名 class 的实例。它不提供声明匿名数组 class.

的方法

这真的应该被劝阻,但如果你需要将你的匿名 class 作为数组的组件类型,你可以使用 java.lang.reflect.Array:

Object o = new Object() {
    public String foo = "bar";
};

Object[] anonArray = (Object[]) java.lang.reflect.Array.newInstance(o.getClass(), 4);
anonArray[0] = o;

这可能很难通过代码审查(你不能在没有反射的情况下构造其他元素)。所以,另一种选择:在你的方法中声明一个本地 class:

class Anon {
    public String foo = "bar";
};

Anon[] anonArray = new Anon[4];

以上 Anon 是方法的局部内容(这是该语言未充分利用的功能)