2010-01-23 18 views
15

En Scala, lo que hace¿Qué significa "rasgo A <: B"?

trait A <: B 

significa? ¿Es lo mismo que

trait A extends B 

?

Editado para agregar: Estoy familiarizado con la sintaxis para los parámetros de tipo, y lo que <: significa en ese contexto. Sin embargo, en el ejemplo anterior, me parece que A es el nombre del rasgo que se declara, no un parámetro de tipo.

+28

Creo que significa que B está sonriendo en A –

+1

FWIW, mi instalación de 2.7.5 no lo permite. –

+0

Estoy usando una instantánea 2.8 (2.8.0.r20331-b20100101020206) –

Respuesta

17

parece compilar a la misma cosa.

~/code/scratch: scala -Xprint:typer -e 'trait B; trait A <: B' 
      // snip 
      abstract trait B extends scala.AnyRef; 
      abstract trait A extends java.lang.Object with this.B 

~/code/scratch: scala -Xprint:typer -e 'trait B; trait A extends B' 
      // snip 
      abstract trait B extends scala.AnyRef; 
      abstract trait A extends java.lang.Object with this.B  

La especificación no lo explica en "5.3.3 Rasgos". Pero el Resumen de sintaxis menciona esto.

TraitDef ::= id [TypeParamClause] TraitTemplateOpt 
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody] 
Extends ::= ‘extends’ | ‘<:’ 

ACTUALIZACIÓN Fue introducido en r14632. Con la opción del compilador -Xexperimental marca el rasgo como abstracto, para usar con una característica de lenguaje propuesta Virtual Traits. Sin -Xexperimental, es un sinónimo de 'extends' que está permitido solo para los rasgos.

+5

Depende de qué parte de la especificación se mire. El apéndice de resumen de sintaxis dice: "Extiende :: = 'extends' | '<:'" –

+0

He presentado un error en la especificación: https://lampsvn.epfl.ch/trac/scala/ticket/2953 – retronym

+0

Vea también http : //lampsvn.epfl.ch/trac/scala/export/20327/scala/branches/devel-base-2.8.0/SIP/virtual-traits/sip-0000X.xhtml –

3

Sí, bueno, casi, vea para obtener un poco más de información. Desde language spec, vemos la siguiente definición:

Definimos dos relaciones entre tipos.

Equivalencia de tipo T ≡ U T y U son intercambiables en todos los contextos.

Conformidad T <: U Tipo T se ajusta al tipo U.

Editar: Mirando en la especificación de lenguaje parece que <: y extends son los mismos, en particular, que se define como:

ClassTemplateOpt ::= Extends ClassTemplate | [[Extends] TemplateBody] 
TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody] 
Extends ::= ‘extends’ | ‘<:’ 
3

En cuanto a Scala Language Specification, parece significar lo mismo. La descripción para el rasgo solo menciona la sintaxis trait A extends B. Pero el resumen de sintaxis utiliza Scala extends y <: indistintamente para las definiciones de rasgos:

TraitTemplateOpt ::= Extends TraitTemplate | [[Extends] TemplateBody] 
Extends ::= ‘extends’ | ‘<:’ 
11

El <: sintaxis está reservado para uso futuro en clases virtuales (que no se ha implementado todavía).

Cuestiones relacionadas