Java可选参数未按预期工作

Java可选参数未按预期工作,java,generics,optional-parameters,Java,Generics,Optional Parameters,我目前正在运行Java7,我发现java在特定情况下有一种奇怪的行为。下面的代码显示了泛型Trie数据结构的迭代器的next() public final Iterator iterator = new Iterator() { private int objsProcessed = 0; private K currentKeySequence = null; @Override public boolean hasNext() { r

我目前正在运行Java7,我发现java在特定情况下有一种奇怪的行为。下面的代码显示了泛型Trie数据结构的迭代器的next()

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 final Iterator Iterator=new Iterator()
{
private int objsProcessed=0;
私有K currentKeySequence=null;
@凌驾
公共布尔hasNext()
{
返回objsProcessed
在以下步骤中添加了键序列:

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;
}
public-Trie-add(V-object,K…keySequence)
{
节点currentNode=root;
for(int i=0;i
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;
}
公共列表获取(K…keySequence)
{
节点currentNode=root;
for(int i=0;i
问题是,当我传递currentKeySequence时,在我的测试用例中,它是一个大小为2的字符[],它使keySequence变量实际上是一个大小为1的数组,其中包含currentKeySequence,而不仅仅是currentKeySequence(大小为2)。如果我传递的不是currentKeySequence,而是新字符[]{'a','b'},则它可以按预期工作,而无需将数组放入包装器数组中

更新: 换句话说,我有currentKeySequence=test=Character[]{'a','b'},其中唯一的区别是currentKeySequence是从列表中检索的,var测试是用“new”关键字在本地实例化的

如果我通过了var测试,那么keySequence=Character[]{'a','b'};如果我通过了currentKeySequence,那么keySequence=Object[]{Character[]{'a','b'}。我知道如果我调用get('a','b'),keySequence将是一个对象[]{'a','b'}。我希望如果参数总是包装到数组中,那么两种情况都是一样的


我是做错了什么还是这是一个错误

这不是一个bug。瓦拉格就是这样工作的

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


在执行任何操作之前,最好先检查数组是否包含项,因为客户端不能为参数指定任何参数。

这不是错误。瓦拉格就是这样工作的

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


在执行任何操作之前,最好先检查数组是否包含项,因为客户端不能为参数指定任何参数。

您的varargs结构正在执行它所指示的操作。它将您提供的所有内容封装到某种类型的数组中
K

如果传递一个数组或多个数组;也就是说,如果传入可以扩展为二维数组的内容,那么varargs会将其解释为varargs数组的单个参数

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

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

原因:它是嵌套在
对象[]
中的
字符[]
(这是完全合法的)。

您的varargs结构正在按要求执行。它将您提供的所有内容封装到某种类型的数组中
K

如果传递一个数组或多个数组;也就是说,如果传入可以扩展为二维数组的内容,那么varargs会将其解释为varargs数组的单个参数

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

new Object[]{new Character[]{'a','b'}}
原因:它是嵌套在
对象[]
中的
字符[]
(这是完全合法的)。

问题在于行
private K currentKeySequence=null

K是字符,但var currentKeySequence被分配给字符[](K[])。调试器中没有可见的问题,也没有在运行时引发问题,但当变量作为参数传递时,它将作为对象[]{Character[]{…}到达方法。在currentKeySequence定义中将K更改为K[]后,该方法收到正确的参数(仅字符[]{…})

问题出在线路上
private K currentKeySequence=null


K是字符,但var currentKeySequence被分配给字符[](K[])。调试器中没有可见的问题,也没有在运行时引发问题,但当变量作为参数传递时,它将作为对象[]{Character[]{…}到达方法。在currentKeySequence定义中将K更改为K[]后,该方法收到正确的参数(仅字符[]{…})

Var args将是一个固定大小的数组,包含传递的所有元素。如果你传递一个任意大小的数组,你会得到一个大小为1的数组,里面有它。你确定
currentKeySequence
是一个
字符[]
?什么是
System.out.println(Arrays.deepT)