2012-06-26 9 views
5

Ich habe folgenden Scala Code:Scala Typ Einschränkungen erlauben nicht null

class X[T1 <: AnyRef] { 
    var _x : T1 = null 
} 

Der Code _x = null wird als Fehler markiert:

error: type mismatch; 
found : Null(null) 
required: T1 
var _x : T1 = null : T1 

Wenn ich Null Typeinschränkung alles funktioniert hinzufügen fein. Warum passiert das? Scala definiert AnyRef als Äquivalent von java.lang.Object, das natürlich nullfähig ist.

+2

Diese im Detail diskutiert wird [hier] (http: // www .scala-lang.org/Knoten/2206). –

Antwort

10

Statt

var _x : T1 = null 

Verwendung

var _x : T1 = _ 

Erklärung von der Scala Language Specification:

A variable definition var x: T = _ can appear only as a member of a template. It introduces a mutable field with type T and a default initial value. The default value depends on the type T as follows:

0 if T is Int or one of its subrange types,
0L if T is Long,
0.0f if T is Float,
0.0d if T is Double,
false if T is Boolean,
() if T is Unit,
null for all other types T.

+1

Klar funktioniert das. Und _x einer Instanz von X ist dann null. Könntest du etwas genauer erklären, was hier vor sich geht? –

-1

Nur der Vollständigkeit halber, mit null in Scala ist ein bisschen entmutigt. Normalerweise wird Ihre Variable in eine Option eingeschlossen, solange Sie keinen guten Grund haben, null zu verwenden. Weitere Details finden Sie unter Option.

+0

Ich verstehe es, aber wir müssen mit Java-Code interoperieren, die Nullen viel verwendet. –

6
class X[T1 <: AnyRef] { 
    var _x : T1 = null 
} 

Wenn Sie es auf NULL festlegbare, ersetzen T1 <: AnyRef mit T1 >: Null sein.

Why this happens?

Nothing ist ein Subtyp von AnyRef und Nothing NULL ist nicht zulässig.

1

Wenn Sie erzwingen möchten, dass der generische Parameter nullable sein muss, dann können Sie eine Set-Untergrenze in den Null-Typ:

class X[T1 >: Null] { 
    var _x : T1 = null 
}