如何将Java数组放在自身内部?

14

我试图创建一个Java对象数组,并将该数组放置在其第二个索引处(为了用该数组表示自相似分形),但当我尝试访问theArray[1][1][0]时,出现以下错误:

Main.java: 11: error: array required, but Object found

这是我到目前为止尝试过的,但不确定为什么它不起作用:

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Object[] theArray = new Object[2];
        theArray[0] = "This array should contain itself at its second index.";
        theArray[1] = theArray; //Now I'm attempting to put the array into itself.
        System.out.println(theArray[1][1][0]) //Main.java:11: error: array required, but Object found
    }
}

我是否可以将Java数组放在其自身内部,就像我在这里尝试的那样?


提示:阅读有关Java“instanceof”运算符的内容。 您将需要它。 - Hot Licks
你可以使用 ((Object[])((Object[])theArray[1])[1])[0] :) - Eng.Fouad
@Eng.Fouad 这让我想起了一些混淆代码,将所有内容都折叠成 Object[] 实例,导致需要进行大量的类型转换;这确实乍一看有点晦涩。 - FThompson
4个回答

19

theArray[1]编译时类型为Object的(因为它来自一个对象数组)。

你需要将其强制转换为Object[]才能将其用作数组。


你遇到的根本问题是,尽管包含其自身的数组是完全有效的对象,但它不是一个有效的类型

您可以任意嵌套数组类型 - Object [] [] [] [] [] [] [] [] [] [] [] [] 是有效的类型。
然而,类型的“底层”不能是一个数组。

您正在尝试创建一个类型,它是自身的数组。
使用泛型,这是可能的:

class Evil extends ArrayList<Evil> { }

@HotLicks:实际上,我相信运行时检查来自JIT编译器。 - SLaks
1
@AndersonGreen:那是因为(Object[])(theArray[1])[1]也是一个Object。你能理解为什么吗? - SLaks
1
@AndersonGreen 现在你只是在更深的一个数组中得到了错误(因为它不知道 theArray[1][1] 是一个数组...) - Henry Keiter
1
@LukeWoodward:我以前不知道,谢谢!http://ideone.com/IS5yuV http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.11 - SLaks
@SLaks:看起来你比我更早找到了参考资料。我在JLS中搜索了太长时间,而实际上它在JVM规范中。我正要发布一个SO问题的链接,但你比我先发了。 - Luke Woodward
显示剩余5条评论

2

由于您声明了theArray为对象数组,所以出现了转换错误。因此,您不能向Java保证theArray [1]是一个数组 - 它可以是任何类型的对象。您需要分解访问以实现您想要的结果:

Object[] innerArray = (Object[]) theArray[1];
System.out.println(innerArray[0] == theArray[0]); // Always true since innerArray IS theArray
while (true) {
    // Careful! This loops forever!
    // set innerArray = innerArray[1] = theArray = theArray[1] = innerArray... 
    // all of these are the exact same object (but you have to tell Java their type every time)
    innerArray = (Object[]) innerArray[1]; 
    System.out.println(innerArray[0]);
}

顺便说一句,据我所知,那永远不会崩溃。 - SLaks
这是同一个数组;它永远不会用完。而且它也不会泄漏内存或堆栈。 - SLaks
@SLaks为什么这不会耗尽?每次迭代都将“innerArray”设置为指向其自己的第二个元素...除非我在没有注意到的情况下做了一些愚蠢的事情? - Henry Keiter
1
innerArray[1]innerArray - SLaks
"innerArray" 取值为 "theArray[1]";"innerArray" 取值为 "innerArray[1]",即为 "theArray[1]",也就是 "innerArray"。因此,行 "innerArray = (Object[]) innerArray[1]" 实际上不起任何作用,而循环实际上是无限的。 - afsantos
谢谢大家,我曲解了OP的设置。我被嵌套数组转换的问题分心了,并忘记了这个数组实际上包含它自己。 - Henry Keiter

1
你的代码等价于:
Object arr = theArray[1];  // arr is an Object here, not an array 

但是你可以这样做。
Object[] arr = (Object[] ) theArray[1];    // Now it is an array

0

使用ArrayList可以很容易地完成这个操作:

ArrayList list = new ArrayList();
list.add(list);

所以现在

System.out.println(list.get(0));

并且

System.out.println(((ArrayList)list.get(0)).get(0)); //Casting because .get() returns an Object

两者将输出相同的内容。

如果您愿意,您可以将其扩展到任意多个级别:

        System.out.println(((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)((ArrayList)list.get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0)).get(0));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接