【问题标题】:java 6 ArrayLists and Arrays and Genericsjava 6 ArrayLists和数组和泛型
【发布时间】: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

我真的不明白,因为allMessagesMyMessages 的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&lt;MyMessage&gt; messages); 而只是调用callFunc(allMessages).
  • 你得到的第一个错误实际上只是一个debugging glitch。第二个问题只是对 API 的滥用——toArray 实际上返回一个 Object[],这就是另一种方法的用途。您可以将空数组传递给 varargs 方法,因此您不需要开关。

标签: java arrays list generics


【解决方案1】:

如果你想使用varargs,除了数组——你还应该确保传递的元素不为空。

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

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

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

【讨论】:

  • callfunc(message) 会做同样的事情
猜你喜欢
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2016-02-16
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多