2012-06-26 8 views
5

tengo el siguiente código Scala:Scala restricciones de tipo no permite nulos

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

El código _x = null se destacó como error:

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

Si añado tipo Null restricción todo funciona multa. ¿Por qué sucede esto? Scala define AnyRef como equivalente de java.lang.Object, que es, por supuesto, anulable.

+2

Esto se discute en detalle [aquí] (http: // www .scala-lang.org/node/2206). –

Respuesta

10

En lugar de

var _x : T1 = null 

uso

var _x : T1 = _ 

Explicación de la especificación del lenguaje Scala:

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

Claramente eso funciona. Y _x de una instancia de X es entonces nulo. ¿Sería capaz de explicar lo que está pasando aquí con más detalle? –

-1

simplemente para la corrección, utilizando nulo en Scala es un poco desanimado. Normalmente envuelve su variable en una Opción siempre que no tenga una buena razón para usar null. Vea Option para más detalles.

+0

Lo entiendo, pero tenemos que interoperar con el código Java que usa nulls mucho. –

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

Si quieren que sea anulable, reemplazar T1 <: AnyRef con T1 >: Null.

Why this happens?

Nothing es un subtipo de AnyRef y Nothing no es anulable.

1

Si desea exigir que el parámetro genérico debe ser anulable, entonces se puede establecer una cota inferior al tipo nulo:

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