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);
}
}