我有一個varargs方法,我想調用使用1或0參數的方法。 下面的代碼編譯,但不能正常運行:當我調試的代碼,我打上//ERROR
行後java 6 ArrayLists和陣列和泛型
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) {
}
,陣列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
是MyMessage
的List
小號!
我看到的唯一選擇是使用類似
if (message == null) {
callFunc();
} else {
callFunc(message);
}
但我想知道的代碼會是什麼樣子,如果我想寫callFunc
只有一次。有什麼建議麼?
我想你是誤解可變參數。如果存在2個消息,其中message1和message2都是MyMessage類型,則不會傳遞數組,而是傳遞2個參數:'callfunc(message1,message2)'。使用可變參數你可以調用'callfunc()'或'callfunc(message1)'或'callfunc(message1,message2)'等。我不知道你想用'msgArrayType'變量來完成什麼。 –
我看到你有更新的代碼,你有if/else結構。這正是你應該如何調用該函數,如果你使用的是可變參數...如果你希望它是比清潔劑,那麼也許你不想可變參數的所有,但有這樣的方法簽名:'公共無效callFunc(名單消息);'而是隻調用'callFunc(allMessages)'。 –
你得到的第一個錯誤實際上只是一個[調試毛刺(http://stackoverflow.com/questions/1367730/how-do-i-deal-with-a-classnotloadedexception-while-debugging)。第二個問題只是API的濫用 - 「toArray」實際上返回一個Object [],這是另一種方法的用途。你可以傳遞一個空數組到可變參數方法,所以你不需要開關。 – Sebastian