【发布时间】:2023-03-25 05:17:01
【问题描述】:
我有一个可变参数方法,我想使用 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
我真的不明白,因为allMessages 是MyMessages 的List!
我看到的唯一选择是使用类似的东西
if (message == null) {
callFunc();
} else {
callFunc(message);
}
但我想知道如果我只想写一次callFunc,代码会是什么样子。有什么建议吗?
【问题讨论】:
-
我认为你误解了可变参数。在您提出的情况下,您不会传递数组,而是传递 2 个参数:
callfunc(message1, message2)如果有 2 条消息,其中 message1 和 message2 都是 MyMessage 类型。使用可变参数,您可以调用callfunc()或callfunc(message1)或callfunc(message1, message2)等。我不知道您要使用msgArrayType变量来完成什么。 -
我在 if/else 结构中看到了您更新的代码。如果您使用可变参数,这正是您应该调用该函数的方式...如果您希望它比这更干净,那么也许您根本不想要可变参数,而是具有方法签名,例如:
public void callFunc(List<MyMessage> messages);而只是调用callFunc(allMessages). -
你得到的第一个错误实际上只是一个debugging glitch。第二个问题只是对 API 的滥用——
toArray实际上返回一个 Object[],这就是另一种方法的用途。您可以将空数组传递给 varargs 方法,因此您不需要开关。