1

Want to clarify about scala.Null. As I know scala.Null has instance null and class. For example if write like this

val x: Null = null 

Type inference set type for the x Null.

According Scala classes hierarhy "please see image" Scala cannot use variables without wrappers like Int, Double, etc. That is why we can found Null for the type inference mechanism resolving. Is it correct vision ?

Scala classes hierarhy

2
  • 1
    That is why we can found Null for the type inference mechanism resolving. You're question is vague. What does that sentence mean? Commented Mar 7, 2016 at 14:28
  • scala.Null for resolving type inference mechanism ? Why we cannot use null like Java ? Commented Mar 7, 2016 at 14:32

2 Answers 2

2

You seem to be mixing some of these concepts:

Type Inference is the ability of the compiler to infer the type when the code doesn't explicitly state it. In your example - you do state the type, and that type is Null - no inference here:

val x: Null = null 

Here's a simple example of type inference:

scala> val whoKnows = 12 whoKnows: Int = 12 

Compiler inferred the type Int since we assigned the value 12, which is an integer. There's much more to it (see http://docs.scala-lang.org/tutorials/tour/local-type-inference), but that's the basics.

null can be used in Scala just like in Java (although it's very much frowned upon, as Scala offers many safer alternatives, mainly None), for example:

scala> val nullStr: String = null nullStr: String = null scala> val nullList: List[Int] = null nullList: List[Int] = null 

Where can't null be used? Just like in Java - for "primitives" like int, double etc. In Scala, there's no such thing as a primitive, but there's still a difference between these "value" types (named with upper-case like other types, e.g. Int, Double) and other types: value types share the common trait AnyVal, whereas all other types share the trait AnyRef - to signify, among other things, this difference.

As for what the Null trait is good for - see Usages of Null / Nothing / Unit in Scala

Sign up to request clarification or add additional context in comments.

Comments

1

The type Null in Scala is a special type. What's special about it is that it is a subtype of all reference types - it's a subtype of every type that is a subtype of AnyRef.

The reason for that is to make it possible to assign the value null to any reference type.

Note that besides reference types, Scala also has value types. These are the types that are subtypes of AnyVal. Examples of value types are the built-in types that map to the primitive types of the JVM: Byte, Short, Int, Long, Float, Double, Boolean, and Char, and also the type Unit.

Note that AnyVal and its subtypes are not subtypes of AnyRef. You can't assign null to a variable of a value type.

Note that the value types Int, Double etc. are not like Java's wrapper types (java.lang.Integer, java.lang.Double etc.). When you use the value types, there is no boxing and unboxing going on to/from objects. These value types directly map to the primitive types of the JVM. Therefore you cannot assign null to a variable of one of those types.

In other words: types like Int and Double are not wrappers, they directly represent primitive types.

Comments