2016-08-29 11 views
5

yml設定からロードする設定であるスカラビーンを作成していますが、長いプロパティが指定されていないが、私は下に向いています。問題。どんな考え?なぜScalaで整数がNULLに初期化できません

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:はい、私はOption[Long]を使用しますが、明快さを望んでいたし、このアプローチに何か問題があることができます。

+0

はい、このアプローチには間違っているものがあります。 'Null'はJavaの残念な遺産であり、元のScalaコードでは使用しないでください。あなたはちょうどランタイムエラーを求めています。 – Malvolio

答えて

10

Scala Longは、Javaではlongのようなリテラルの日付型です。 Intについても同様です。 しかしIntegerは、あなたがNULL可能ロング値をしたい場合、あなたはjava.lang.Long

+0

私はクラスdefに基づいて、そう思った。 これは非常に混乱しているbtwです!これは意図されているのか、それとも監視だけなのでしょうか? – mukh007

+0

これは2つのポリシー間の衝突です:Scalaの型は大文字で、IntやLongのようなプリミティブでもあり、java.langのすべてがデフォルトで利用可能です。 – Malvolio

8

IntLongを使用することができますラッパークラスすなわちjava.lang.Integer

あるScalaの型であるとAnyValから導出され、参照型(すなわちないAnyRefされていません)したがって、nullにはなり得ません。一方、Integerは参照タイプであるjava.lang.Integerの別名です。いいえ、それはIntLongが一貫している、監督

はないですが、Scalaではnullを使用すると、nullは、Javaの互換性(偶数AnyRef用)などIntegerのためだけに存在している、私はそれを理解し、悪いこととみなされます。

1

Scalaでは、タイプscala.Nullは、すべての参照タイプ(scala.AnyRefから継承するすべてのタイプ - java.lang.Objectのエイリアス)のサブタイプです。そのため、参照タイプが予想される場合はnullの値(タイプscala.Null)を使用することができます。

ただし、値型のサブタイプ(scala.AnyValから継承する型)はありません。 scala.Int,scala.Long,scala.Boolean ...(Javaのプリミティブ型に対応)などの型は値型なので、nullにすることはできません。私はこれがjava.lang.Integerだと思い、(別称scala.AnyRefjava.lang.Objectのサブタイプである:それは参照型ですので、あなたはnullを使用することができますあなたが言及Integerタイプについては

それは(the official documentationから持ち上げ)Scalaの型階層のこの図を理解することは、おそらく簡単です: Scala types hierarchy

関連する問題