2012-06-26 13 views
5

Ho il seguente codice Scala:Scala vincoli di tipo non consente nulla

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

Il codice _x = null viene evidenziata come errore:

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

Se aggiungo tipo Null vincolo tutto funziona bene. Perché questo succede? Scala definisce AnyRef come equivalente di java.lang.Object, che è ovviamente nullable.

+2

Questo è discusso in dettaglio [qui] (http: // www .scala-lang.org/node/2206). –

risposta

10

Invece di

var _x : T1 = null 

uso

var _x : T1 = _ 

Spiegazione dalla Scala Specifica del linguaggio:

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

Chiaramente questo funziona. E _x di un'istanza di X è quindi nullo. Sareste in grado di spiegare cosa sta succedendo qui in qualche altro dettaglio? –

-1

Solo per completezza, utilizzando nulla a Scala è un po 'scoraggiato. Di norma, avvolgi la tua variabile in un'opzione finché non hai una buona ragione per usare null. Vedi Option per maggiori dettagli.

+0

Lo capisco, ma dobbiamo interagire con il codice Java che usa molto i null. –

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

Se si vuole che sia annullabile, sostituire T1 <: AnyRef con T1 >: Null.

Why this happens?

Nothing è un sottotipo di AnyRef, e Nothing non è annullabile.

1

Se si desidera applicare il parametro generico deve essere annullabile, allora si può impostare una minore legato al tipo Null:

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