2015-01-05 64 views
0

我目前正在运行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'}。我期望如果参数总是包装到一个数组中,两种情况都是一样的。

我做错了什么或者这是一个错误?

+0

Var args将是一个包含所有传递元素的固定大小的数组。如果你传递任何大小的数组,你将得到一个大小为1的数组。 – AlfredoVR

+0

而你确定* currentKeySequence是'Character []'?什么'System.out.println(Arrays.deepToString(currentKeySequence))'给你回来? – Makoto

+0

你是怎么定义'K'的? – GriffeyDog

回答

0

的问题是线 private K currentKeySequence = null;

钾含量字符但VAR currentKeySequence被分配给字符[](K [])。在调试器中没有看到任何问题,或者在运行时出现问题,但是当变量作为参数传递时,它以Object [] {Character [] {...}}的形式到达。一旦在当前KeySequence定义中将K改为K [],该方法就会收到正确的参数(只是Character [] {...});

3

这不是一个错误。这就是varags的工作原理。

变量参数(varags)允许您传入无参数或多个参数。为了做到这一点,它使用一个数组来跟踪参数。一个论点不是特别的;它存储在数组的第一个索引中。

在执行任何操作之前,它总是检查数组是否包含项目,因为客户端可以不指定参数参数。

+0

然后,它们都应该算作一个参数。如果我做Character [] test = new Character [] {'a','b'}; Object result = reference.get(test);它工作正常,但为什么与上面的var“test”基本相同的currentKeySequence不起作用?唯一的区别是我从列表中调出它,调试器仍然显示它为一个数组,就像“test” –

+0

@GabrielPiacenti你是什么意思?变量argumentd作为数组处理。如果你指定一个数组,那么将使用该数组。如果不是,将创建一个新的数组,并且您的参数将被存储在它们中 –

+0

我的意思是currentKeySequence = test = Character [] {'a','b'}唯一的区别是它从列表中检索。如果我通过测试,然后keySequence = Character [] {'a','b'}如果我通过currentKeySequence然后keySequence =对象[] {字符[] {'a','b'}} –

2

你的可变参数结构正在做它所说的。它将您给它的所有内容封装到某种类型的数组K中。

如果您通过阵列阵列;也就是说,如果你传递了一些可以扩展为二维数组的东西,那么可变参数将把它解释为可变参数数组的单个参数。

在你的问题,这也将被视为二维数组:

new Object[]{new Character[]{'a','b'}} 

原因是:它是嵌套在Object[]内部的Character[](这是完全合法的)。

+0

我没有发送Object [] {new Character [] {'a','b '}},我在一种情况下发送字符[] {'a','b'},该字符正在转换为Object [] {new Character [] {'a','b'}}}其他。 –

+0

我在原始问题的评论部分中提供了一些代码,以证明这种情况。我鼓励你这样做。 – Makoto