Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java将对象强制转换为Object[]数组并对循环进行了丰富_Java_Arrays_Object_Foreach_Arguments - Fatal编程技术网

Java将对象强制转换为Object[]数组并对循环进行了丰富

Java将对象强制转换为Object[]数组并对循环进行了丰富,java,arrays,object,foreach,arguments,Java,Arrays,Object,Foreach,Arguments,假设我像这样将参数传递到函数中 似乎参数之外的对象知道它是对象[]数组。 但是它里面的对象[]不是对象数组的,而是普通对象的 Object[] arguments = { new Object[] {"command", "value"}, new Object[] {"List_test", Arrays.asList("1", "2", "3", "4")}, new Object[] {"single command"} }; myFunc(arguments)

假设我像这样将参数传递到函数中

似乎参数之外的对象知道它是
对象[]
数组。
但是它里面的
对象[]
不是对象数组的,而是普通对象的

Object[] arguments = {
    new Object[] {"command", "value"},  
    new Object[] {"List_test", Arrays.asList("1", "2", "3", "4")},
    new Object[] {"single command"}
};
myFunc(arguments);

我在Java控制台中尝试了这个

> for(Object[] a : arguments) { System.out.println(a); }
出现此错误

静态错误:赋值中的错误类型:从对象到对象[]

这看起来更糟

Object[][] arguments = {
    { new Object[]{"command", "value"}},  
    { new Object[]{"List_test", Arrays.asList("1", "2", "3", "4")}},
    { new Object[]{"single command"}}
};

您的变量声明为

Object[] arguments ...
换句话说,它是一个
对象的数组。不管元素在其中是什么,编译器只能保证每个元素至少是一个
对象

这就是为什么你可以这么做

for(Object objArray : args) { //this one is good.
但不是

for(Object[] objArray : args) { //this don't work.
因为
args
引用的
对象[]
可能包含非
对象[]
的内容

例如,您可能有

Object[] arguments = {
    new Object[] {"command", "value"},  
    new Object[] {"List_test", Arrays.asList("1", "2", "3", "4")},
    new Object[] {"single command"},
    new Foo(),
    new Bar()
};

编译器无法知道运行时
对象[]
中将包含什么。

不能更改现有变量并为其指定新类型。但是,您可以强制转换它并将其分配给所需类型的新变量:

for(Object obj : args) { //this one is good.
    if (obj == null) continue;
    Object[] objArray = (Object[]) obj; //Assigning to new variable instead
    for(Object eachObject : objArray) { //Now this works!
        System.out.println("eachObject reference = " + eachObject);
    }
}

当您将参数声明为
OBJect[]
时,编译器知道
arguents
中有一些
OBJect
作为元素。但是它不知道元素
对象
是否也是
对象数组
。所以你不允许做这些

但是,如果您确定元素将仅为
对象数组
,则可以像下面这样强制转换为
对象[]

            for(Object objArray : args) { 
                if(objArray == null) continue;
                    Object[] ob = (Object[])objArray ;
                    for(Object eachObject : ob) { 
                        System.out.println("eachObject reference = " + eachObject);
                    }
            }

我怎样才能让它相信我?既然我知道它只会是
Object[]
,它不是使用
instanceof
之类的东西来判断它是否错了吗?@SSpoke将变量声明为
Object[][]
,并相应地实例化它。不,在这种情况下,您可能无法强制增强for循环使用
instanceof
@SSpoke。但这在其他地方可能并不合适。考虑一下你的对象的一些封装。哈哈,我刚刚兴奋过度了,没有理由真正使用<代码>对象[][C]<代码>解决方案StimeLek和KeppiL发布了精彩的工作。刚刚测试过。。
Object[][]
解决方案只会使循环看起来更好,但是参数中会有很多额外的括号。哎。。。我不想为参数创建一个更好的类,像这样的类可以是任何。。这就是我喜欢的方式。@s请注意,使用
Object[][]
是类型安全的。但是,如果您确定
对象[]
中包含的内容,那么这些解决方案就可以了。再说一次,我怎么强调都不过分,我不推荐这个。编写自己的类型并使用它们。
            for(Object objArray : args) { 
                if(objArray == null) continue;
                    Object[] ob = (Object[])objArray ;
                    for(Object eachObject : ob) { 
                        System.out.println("eachObject reference = " + eachObject);
                    }
            }