2016-08-29 21 views
5

bir yml yapılandırmasından yüklenecek bir yapılandırma olan scala fasulyemi oluşturuyorum, uzun bir özellik belirtilmemiş boş belirtmek istiyorum ama aşağıda yaşıyorum konu. Bir fikrin neden?Neden Scala Long, tamsayı sıfır olarak başlayamıyor Null olarak

startOffset: Integer = null 
scala> var endOffset: Long = null 
<console>:11: error: an expression of type Null is ineligible for implicit conversion 
    var endOffset: Long = null 
         ^` 

PS: Evet Option[Long] kullanmak ancak netlik istedi ve bu yaklaşımın yanlış bir şey yoktur yapabilirsiniz.

+0

Evet, bu yaklaşımla sorun var. 'Null', Java’dan talihsiz bir mirastır ve asla orijinal Scala kodunda kullanılmamalıdır. Sadece çalışma zamanı hataları için yalvarıyorsunuz. – Malvolio

cevap

10

Scala Long, Java dilinde long olarak bilinen bir türüdür. Aynı şey Int için geçerlidir. Ama Integerjava.lang.Long

+0

Sınıf def'e bağlı olarak bunu yaptım. Bu çok kafa karıştırıcı btw! Bu amaçlanmış mı yoksa sadece bir gözetim mi? – mukh007

+0

Sadece iki politika arasında bir çarpışma var: Scala'daki türler büyük harfle, Int ve Long gibi ilkel öğelerde bile olsa, ve java.lang'dan gelen her şey varsayılan olarak kullanılabilir. – Malvolio

8

Int ve Long Scala türleridir ve bir referans tipi (yani değil AnyRef olmadığı, AnyVal türetilen bir Sarıcı sınıfı yani java.lang.Integer

Eğer null Uzun değeri isterseniz, kullanabileceği başka) ve dolayısıyla null olamaz. Integer ise, bir referans türü olan java.lang.Integer için bir diğer addır.

Hayır, Int ve Long Anladığım kadarıyla Scala nullnull sadece Java uyumluluğu (hatta AnyRef için) yanı Integer olarak için var, kötü bir şey olarak kabul edilir ve kullanan, tutarlı bir gözetim değil.

1

Scala'da, scala.Null türünde tüm başvuru türlerinin bir alt türü (scala.AnyRef'dan gelen tüm türler - java.lang.Object'un bir diğer adıdır). Bu nedenle, referans türünün beklendiği her yerde null değerini (tip scala.Null) kullanabilirsiniz. Bununla birlikte, herhangi bir değer türünün bir alt türü (scala.AnyVal'dan gelen türler) değildir. scala.Int, scala.Long, scala.Boolean ... gibi türler (Java'nın ilkel türlerine karşılık gelir) değer türleri olduğundan, bunlar boş olamaz.

Sözünü Integer tipi gelince: Bu java.lang.Object (nam-ı diğer scala.AnyRef) bir alt türü olan java.lang.Integer, sanırım: Eğer null kullanabilirsiniz böylece bir referans türüdür.

O (the official documentation kaldırıldığı) Scala tipi hiyerarşisinin bu diyagramı anlamak muhtemelen daha kolay: Scala types hierarchy

İlgili konular