簡體   English   中英

Java可選參數未按預期工作

[英]Java optional parameter not working as expected

我當前正在運行Java 7,發現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 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的Character [],它使keySequence變量實際上是一個大小為1的數組,其中包含currentKeySequence而不是僅是currentKeySequence(大小為2)。 如果我傳遞了新的Character [] {'a','b'}而不是currentKeySequence,則它可以按預期工作,而無需將數組放入包裝器數組中。

更新:換句話說,我有currentKeySequence = test = Character [] {'a','b'},其中唯一的區別是從列表中檢索了currentKeySequence,並且使用“ new”關鍵字在本地實例化了var測試。

如果我通過var測試,則keySequence = Character [] {'a','b'},如果我通過currentKeySequence,則keySequence = Object [] {Character [] {'a','b'}}。 我知道,如果我調用get('a','b'),keySequence將是一個Object [] {'a','b'}。 我希望,如果將參數始終包裝到數組中,則兩種情況將是相同的。

我是在做錯什么還是錯誤?

這不是錯誤。 這就是varags的工作方式。

可變參數(varags)允許您不傳入任何參數或傳入多個參數。 為此,它使用一個數組來跟蹤參數。 單個參數並不特殊; 它存儲在數組的第一個索引中。

在執行任何操作之前檢查數組是否包含項始終是一件好事,因為客戶端無法為該參數指定任何參數。

您的varargs結構正在執行所要求的操作。 它會將您提供的所有內容封裝到某種類型為K的數組中。

如果您傳遞一個數組數組 也就是說,如果傳入的東西可以擴展為二維數組,則varargs會將其解釋為varargs數組的單個參數。

在您的問題中,這也將被視為二維數組:

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

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

問題是private K currentKeySequence = null;private K currentKeySequence = null;

K是Character,但是將var currentKeySequence變量分配給Character [](K [])。 在調試器中看不到問題,也沒有在運行時引發問題,但是當變量作為參數傳遞時,它以Object [] {Character [] {...}}的形式到達方法中。 一旦在currentKeySequence定義中將K更改為K [],該方法將接收正確的參數(只是Character [] {...});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM