你能创建一个匿名类的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数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java 类的重载/匿名类的使用/可变形参

java自定义类型数组

二维数组java - 多个错误[重复]

java中,匿名内部类可以使用外部类的成员变量吗

java中常用APIScanner类匿名对象Random类ArrayList类对象数组

使用 Java 从类数组创建类的新实例