2010-08-07 17 views
7

Burada kod-java.util.concurrent.LinkedBlockingQueue put yöntemi, Scala'da argüman olarak hiçbir şey gerektirmez

import java.util.concurrent.LinkedBlockingQueue 

def main(args:Array[String]) { 
    val queue=new LinkedBlockingQueue 
    queue.put("foo") 
} 

snippetidir. Bu bana verir -

hatası: tür uyuşmazlığı;
bulundu: java.lang.String ("foo")
gerekli: Hiçbir şey
queue.add ("foo")

Anlayışım benim için bir şey değil. sıraya. Bu durumda, varsayılan genel olanlar yerine LinkedBlockingQueue için scala türlerini nasıl belirleriz?

+0

Not. Bunun yerine, mümkün olan en spesifik tiptir. :-) –

cevap

3
bir tür imza kaynağı yok ama biri gerektiğinde

Scala en fazla sınırlandırma imzayı kullanmaktadır. Nothing hepsinden önemlisi kısıtlayıcı olduğu için (Nothing olabilir şey!), Scala seçer LinkedBlockingQueue[Nothing].

ama bunda durumda, kısıtlama aslında pu olamaz demek Bu son derece kısıtlayıcı sıraya bir şey. Zaten keşfettim gibi

, çözüm koleksiyonunda sınıfların tipini belirtmektir:

val queue = new LinkedBlockingQueue[String] 

Ama tip inferencer izleyerek diğer durumlarda doğru türde anlamaya unutmayın " mümkün olduğunca kısıtlayıcı "kural. Örneğin initial eğer içeren dizeleri olarak yazıldığında başka bir Java koleksiyonu, bu initial den String türünü kapalı okurdum olarak

val queue = new LinkedBlockingQueue(initial) 

sadece çalışacak olan.

1

Doğru tahmin ettim.

val queue=new LinkedBlockingQueue[String] 
1

Java ham tipleri geriye dönük uyumluluk ve kullanım dikkate kötü stiline imtiyaz vardır - gösterildiği gibi türü belirtilmelidir. Scala'da ham türünüz yok, bu yüzden bunları belirtmeniz ya da inferrer'ın bunları türetebilmesi gerekir. sen de sol tarafta parametrik türünü belirtmek unutmayın.

val queue:LinkedBlockingQueue[String] = new LinkedBlockingQueue() 

burada pek anlamda yapar, ama önemli olan bir deyişle (farklı türde yapmak istiyorsanız, örneğin sizin değişken için Queue[String]