你能创建一个匿名类的Java数组吗?
Posted
技术标签:
【中文标题】你能创建一个匿名类的Java数组吗?【英文标题】:Can you create a Java array of an anonymous class? 【发布时间】:2021-04-30 22:49:53 【问题描述】:我想知道是否可以创建一个 Java 匿名类的数组。例如,我试试这个代码:
final var anonArray = new Object()
public String foo = "bar";
[4];
但这会产生错误:error: array required, but <anonymous Object> found
。这可能吗?
【问题讨论】:
【参考方案1】:请记住,new Object() ...
给你的是一个值而不是一个类型。
所以,下面是创建匿名类实例数组的方法:
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";
;
或者如果你想要一个具有相同匿名类实例 4 次的数组:
final Object anonInstance = new Object()
public String foo = "bar1";
;
final Object[] anonArray = new Object[]
anonInstance, anonInstance, anonInstance, anonInstance
;
或者,如果您想要同一个匿名类的 4 个不同实例:
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
的匿名子类的数组”。很难想象这会很重要,但如果确实很重要,您将需要借助反射来创建数组类。 (参见@ernest_k 的answer。)
或者只是声明一个适当的自定义类或接口的数组,并从该类/接口创建匿名子类。 Object
的匿名子类并不完全实用......
【讨论】:
> 记住 new Object() ... 给你的是一个值而不是一个类型。啊,我完全忘记了。谢谢。【参考方案2】:语法new Object()
创建匿名类的实例。它不提供声明匿名类数组的方法。
这确实不应该,但是如果你需要将你的匿名类作为数组的组件类型,你可以使用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 Anon
public String foo = "bar";
;
Anon[] anonArray = new Anon[4];
上面的Anon
是该方法的本地化(这是该语言未充分利用的特性)
【讨论】:
我不知道 Java 有本地类!我最近才发现 Kotlin 在抱怨class
甚至在方法中也是保留关键字之后才发现它们,我对此感到非常惊讶,但是看到 Java 与它们在一起我真的很惊讶。谢谢!以上是关于你能创建一个匿名类的Java数组吗?的主要内容,如果未能解决你的问题,请参考以下文章