2013-12-13 51 views
0

我有一個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 

我真的不明白,因爲allMessagesMyMessageList小號!

我看到的唯一選擇是使用類似

if (message == null) { 
    callFunc(); 
} else { 
    callFunc(message); 
} 

但我想知道的代碼會是什麼樣子,如果我想寫callFunc只有一次。有什麼建議麼?

+0

我想你是誤解可變參數。如果存在2個消息,其中message1和message2都是MyMessage類型,則不會傳遞數組,而是傳遞2個參數:'callfunc(message1,message2)'。使用可變參數你可以調用'callfunc()'或'callfunc(message1)'或'callfunc(message1,message2)'等。我不知道你想用'msgArrayType'變量來完成什麼。 –

+0

我看到你有更新的代碼,你有if/else結構。這正是你應該如何調用該函數,如果你使用的是可變參數...如果你希望它是比清潔劑,那麼也許你不想可變參數的所有,但有這樣的方法簽名:'公共無效callFunc(名單消息);'而是隻調用'callFunc(allMessages)'。 –

+2

你得到的第一個錯誤實際上只是一個[調試毛刺(http://stackoverflow.com/questions/1367730/how-do-i-deal-with-a-classnotloadedexception-while-debugging)。第二個問題只是API的濫用 - 「toArray」實際上返回一個Object [],這是另一種方法的用途。你可以傳遞一個空數組到可變參數方法,所以你不需要開關。 – Sebastian

回答

-2

如果你想使用varargs,除了一個數組 - 你還應該確保傳遞的元素是非空的。

因此,如果您只想使用一個函數調用callfunc()並且不想用if-else塊包圍,則可以使用以下函數調用。

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

這將傳遞包裝在數組中的消息對象,或者它將傳遞一個具有單個null元素的數組。

+1

'callfunc(message)'會做同樣的事情 – newacct