2016-12-16 14 views
2

Scalaのバージョン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

'Int'に' null 'を割り当てることはできません(参照型ではありません)。したがって、それは0に変換されます。一般的にscalaではnullの使用は推奨されません。これがその理由の1つです。あなたはスカラ構文でJavaコードを書いていますが、あまり有用ではありません。スカラー・マインドセットに入ってください。 – Dima

+0

@Dima 'ConcurrentLinkedQueue'の代わりにスカラーがありますか? – jilen

答えて

1

Scalaでは、IntAnyValに拡張されています。 AnyValを拡張するタイプはnullの値にバインドできません。

このコードは、IntIntegerリファレンスタイプの間にカバーの背後にボクシングとアンボクシングが起こっているため準拠しています。例えば、Intの代わりにIntegerConcurrentLinkedQueueを設定する:

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

と同じあなたはoffer経由で値を引き出したときに行く、コンパイラが行います

unboxBoxesRunTime.unboxtoIntに行く
val e: Int = unbox(queue.poll()); 

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

だからこそ、0の代わりにnullです。 ScalaのJavaクラス間でこのような相互運用を行うときは注意してください。

関連する問題