2016-12-16 107 views
2

斯卡拉版本2.12.1-20161205-201300-2787b47呼叫`ConcurrentLinkedQueue.poll`對空隊列似乎返回0,而不是空

val max = 20 
val queue = new java.util.concurrent.ConcurrentLinkedQueue[Int]() 
(1 to 10).foreach(queue.offer) 
def show(c: Int): Unit = { 
    val e = queue.poll() 
    if(c < max && e != null) { 
     println(e) 
     show(c + 1) 
    } 
    } 
show(0) 

REPL輸出

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 

發生了什麼?

+0

您不能將'null'賦值給'Int'(它不是引用類型)。所以,它將它轉換爲0.一般來說,scala中不鼓勵使用null。這是它的原因之一。你正在用scala語法編寫java代碼,它不是很有用。進入斯卡拉思維模式。 – Dima

+0

@Dima有沒有可以替代'ConcurrentLinkedQueue'的scala? – jilen

回答

1

在斯卡拉,Int延伸AnyVal。類型延伸AnyVal無法綁定到null值。

此代碼符合,因爲在IntInteger引用類型之間的封面之後發生了裝箱和拆箱。例如,要設置ConcurrentLinkedQueueInteger而不是Int

def apply$mcZI$sp(x$1: Int): Boolean = queue.offer(scala.Int.box(x$1)); 

而且也是一樣,當你通過offer拉出來的值,則編譯器:

val e: Int = unbox(queue.poll()); 

unboxBoxesRunTime.unboxtoInt

public static int unboxToInt(Object i) { 
    return i == null ? 0 : ((java.lang.Integer)i).intValue(); 
} 

這就是爲什麼你看到0而不是null。在Scala中的Java類之間進行這種互操作時要小心。