你能创建一个匿名 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
是方法的局部内容(这是该语言未充分利用的功能)
我想知道是否可以创建一个 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
是方法的局部内容(这是该语言未充分利用的功能)