我目前正在運行java 7,我發現java在特定情況下有奇怪的行爲。下面的代碼顯示一個迭代的針對通用特里數據結構中的下一個():Java可選參數不能按預期工作
public final Iterator iterator = new Iterator()
{
private int objsProcessed = 0;
private K currentKeySequence = null;
@Override
public boolean hasNext()
{
return objsProcessed < numObjects;
}
@Override
public Object next()
{
if (keySequences.isEmpty() == false)
{
currentKeySequence = keySequences.get(objsProcessed);
}
else
{
return null;
}
objsProcessed++;
Character[] test=new Character[]{'a','b'};
Object result = reference.get(test);
result = reference.get(currentKeySequence);
return result;
}
@Override
public void remove()
{
reference.remove(currentKeySequence);
}
};
密鑰序列添加在以下:
public Trie add(V object, K... keySequence)
{
Node<K, V> currentNode = root;
for (int i = 0; i < keySequence.length; i++)
{
currentNode = currentNode.insert(new Node<K, V>(keySequence[i],
currentNode));
}
currentNode.addObject(object);
keySequences.add((K) keySequence);
numObjects++;
return this;
}
get方法採用可變數目的參數:
public List<V> get(K... keySequence)
{
Node<K, V> currentNode = root;
for (int i = 0; i < keySequence.length; i++)
{
currentNode = currentNode.getNode(keySequence[i]);
}
if (currentNode != null)
return currentNode.getObjects();
else
return null;
}
的問題是,當我通過currentKeySequence其是,在我的測試的情況下,一個字符[]大小2的,它使keySequence變量實際上是尺寸1的是CON的陣列保留currentKeySequence而不僅僅是currentKeySequence(大小2)。如果不是currentKeySequence,我會傳遞新的Character [] {'a','b'},它可以按預期工作,而不會將數組放入包裝數組中。
更新: 換句話說,我有currentKeySequence =測試=字符[] {「A」,「B」},其中唯一的區別是currentKeySequence從列表中檢索和VAR測試本地實例化與「新」關鍵字。如果我通過var test,那麼keySequence = Character [] {'a','b'},如果我通過currentKeySequence,那麼keySequence = Object [] {Character [] {'a','b' }}。我知道如果我調用get('a','b'),keySequence將是一個Object [] {'a','b'}。我期望如果參數總是包裝到一個數組中,兩種情況都是一樣的。
我做錯了什麼或者這是一個錯誤?
Var args將是一個包含所有傳遞元素的固定大小的數組。如果你傳遞任何大小的數組,你將得到一個大小爲1的數組。 – AlfredoVR
而你確定* currentKeySequence是'Character []'?什麼'System.out.println(Arrays.deepToString(currentKeySequence))'給你回來? – Makoto
你是怎麼定義'K'的? – GriffeyDog