java 6 ArrayLists和Arrays and Generics

时间:2013-12-13 16:31:52

标签: java arrays list generics

我有一个varargs方法,我想使用1或0参数调用该方法。 以下代码编译,但无法正确运行:

final List<MyMessage> allMessages = new ArrayList<MyMessage>();
MyMessage message = null;
if (checkSomeCondition()) {
  message = new MyMessage(someParam);
  allMessages.add(message);
}

int size = allMessages.size();
MyMessage[] msgArrayType = new MyMessage[size]; // ERROR
MyMessage[] msgArray = allMessages.toArray(msgArrayType);

callFunc(msgArray);
...........
public void callFunc(MyMessage... messages) {

}

当我调试代码时,在我使用//ERROR标记的行之后,数组msgArrayType的值为com.sun.jdi.ClassNotLoadedException: Type has not been loaded occurred while retrieving component type of array.

这也是错误的:

MyMessage[] msgArray = (MyMessage[]) allMessages.toArray();
// -> java.lang.Object cannot be cast to .......MyMessage

我真的不明白,因为allMessagesList的{​​{1}}!

我看到的唯一选择是使用

之类的东西
MyMessage

但我想知道如果我只想写一次if (message == null) { callFunc(); } else { callFunc(message); } ,代码会是什么样子。有什么建议吗?

1 个答案:

答案 0 :(得分:-2)

如果你想使用除了数组之外的varargs,你还应该确保传递的元素是非空的。

因此,如果您只想使用callfunc()的一个函数调用而不想使用if-else块进行包围,则可以使用以下函数调用。

callfunc(message == null ? (Object)null : message);

这将传入包含在数组中的消息对象,或者它将传递一个包含单个null元素的数组。

相关问题