2015-08-29 16 views
10

Scala'da BoxedUnit ve Unit arasındaki fark nedir? Bir fonksiyonun dönüş tipi olarak ne zaman kullanılır? Ve REF ile ilişkileri nedir? Burada, Birim ile çalışırken karşılaştığım tür uyuşmazlığı hatası var.Scala'da BoxedUnit vs. Birim

error: java.lang.AssertionError: assertion failed: Can't convert from UNIT to REF(class BoxedUnit) in unit hello.scala at source-/Users/shiyu/Scala/FinalDataFlow/src/print/hello.scala,line-347,offset=13999

cevap

11

Unit benzersiz değeri () tipi, telaffuz "birimi".

BoxedUnit bir genel bağlamında girer ya da başka Any atandığında () kodlamak için kullanılan JVM Scala bir uygulama ayrıntı vardır. Normalde, kullanıcı düzeyinde bazı özelliklere sızmakla birlikte, ilk etapta BoxedUnit'u duymamalısınız. Örneğin ((): Any).getClass().getName() == "scala.runtime.BoxedUnit".

Bu, aldığınız hatanın açıkça, AssertionError tarafından kanıtlandığı gibi bir derleyici çökmesi olduğunu söyledi. Kodunda sorun değil. Zaten hata veritabanında değilse, muhtemelen report this as a bug olmalıdır.

+0

@srjd birim öğesi içeren bir AnyVal üzerinde desen eşleştirmeye çalışırsam ne olur? Mesela, 'Case Right (Unit) 'yi kullanmaya çalıştım ve eşleşmedi. Bu desen eşleştirmeyi nasıl yapacağım? –

+0

'case Right (anyVal) kullanıyorum eğer (anyVal == Unit || anyVal.isInstanceOf [BoxedUnit])' ve çalışıyor ama ben bir istemci perspektifinden biraz çirkin buluyorum –

+1

'case Right (())' . * Type * 'Unit''in benzersiz değeri'() 'dır. * Value * 'Unit',' '' '' ile aynı olmayan 'Unit' sınıfının asıl nesnesidir. – sjrd