Java 传递对象数组,而不是不确定数量的对象
我有一个函数,它以不确定数量的ImageButtons作为参数Java 传递对象数组,而不是不确定数量的对象,java,android,Java,Android,我有一个函数,它以不确定数量的ImageButtons作为参数 private void addButtons(ImageButton... ib) { // ... } 因此,如果我想这样称呼它,这是完美的: addButtons(button1, button2, button3); 但现在我碰巧不得不使用未知数量的对象作为参数,例如数组。在addButtons内部,ImageButton参数用作数组,因此我尝试了以下方法: ArrayList<ImageButton> ib
private void addButtons(ImageButton... ib) {
// ...
}
因此,如果我想这样称呼它,这是完美的:
addButtons(button1, button2, button3);
但现在我碰巧不得不使用未知数量的对象作为参数,例如数组。在addButtons内部,ImageButton参数用作数组,因此我尝试了以下方法:
ArrayList<ImageButton> ibs = new ArrayList<ImageButton>();
// feed the ibs ArrayList
addButtons((ImageButton[])ibs.toArray());
我得到一个ClassCastException
为什么?实际上,toArray方法返回一个对象[]
您必须使用重载方法
你应使用:
addButtons(ibs.toArray(new ImageButton[ibs.size()]));
使用重载的toArray方法,可以在其中指定数组类型
addButtons(ibs.toArray(new ImageButton[0]));
如果需要,可以指定大小。如果不这样做,则该方法只需在添加元素之前创建一个更大的数组。由于类型擦除,除非您帮助,否则泛型集合无法创建强类型数组:
addButtons(ibs.toArray(new ImageButton[ibs.size()]));
除非你给它传递一个正确类型的数组,否则它只能返回一个对象[]。你的意思是:ibs.toArraynew ImageButton[ibs.size]ZouZou在Android上我找不到toArrayint x,没有这样的函数。@Beppi是这样的吗?谢谢你,它工作了!!!我用它。无论如何,我仍然不明白为什么:它清楚地表明不需要指定数组:返回一个包含此ArrayList中包含的所有元素的数组。如果指定的数组足够大以容纳元素,则使用指定的数组,否则将创建相同类型的数组。@Beppi的toArray返回Object[],但toArraynew ImageButton[…]返回ImageButton[],而addButtons则期望ImageButton[]只是迂腐而已。。。。数组类型与泛型和擦除无关。这在那之前是真的:@rolfl:是的,但这是意料之中的。你会期望一个通用的集合能够像C Cant一样做到这一点。这是真的,没有帮助,它就不能正常工作,这是违反直觉的——通过擦除,“直觉”信息消失了……这很聪明。我不需要指定尺寸。