![](/img/trans.png)
[英]Optional Parameter query with IS NULL not working as expected in Java Sqlite
[英]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.