我目前正在运行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