【问题标题】:Can you create a Java array of an anonymous class?你能创建一个匿名类的Java数组吗?
【发布时间】:2021-04-30 22:49:53
【问题描述】:

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

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

但这会产生错误:error: array required, but <anonymous Object> found。这可能吗?

【问题讨论】:

    标签: java arrays class anonymous-class


    【解决方案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 与它们在一起我真的很惊讶。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 2013-02-18
    • 2019-06-14
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2016-07-02
    • 2020-01-11
    相关资源
    最近更新 更多