2010-07-08 24 views
18
scala> class A(implicit a: Int); 
defined class A 

scala> class B()(implicit a: Int); 
defined class B 

scala> new A()(1) 
res1: A = [email protected] 

scala> new B()(1) 
res2: B = [email protected] 

scala> new A(1) 
<console>:7: error: too many arguments for constructor A:()(implicit a: Int)A 
     new A(1) 

¿Por qué Scalac inserta una lista de parámetros vacía antes de la lista de parámetros implícita proporcionada en la declaración de clase?¿Por qué la primera lista de parámetros de una clase no puede estar implícita?

Ésta parece ser una característica, no es un error, a juzgar por el commentary in the scalac sources:

convertir // (implícita ...) a () (implícito ...) si es el único parámetro sección

Tengo curiosidad por saber por qué se hace esto. Me parece bastante sorprendente.

Respuesta

7

La forma en que lo veo es que la lista de parámetros implícitos no reemplaza los regulares. Dado que para definiciones de constructores se necesita al menos una lista de parámetros, si no se indica explícitamente, se genera '()'.

Si bien esto podría ser desconcertante, está en línea con la generación de un constructor vacío cuando no hay listas de parámetros en absoluto.

5

De acuerdo, con la ayuda de @ venechka's answer, creo que lo he descubierto.

Con las clases ordinarias, Scala infiere y la lista de parámetros vacía, ya sea en la declaración de clase (class B), o en el punto de instancias de clase (new A y new B):

scala> class A() 
defined class A 

scala> new A 
res19: A = [email protected] 

scala> new A() 
res20: A = [email protected] 

scala> class B 
defined class B 

scala> new B 
res21: B = [email protected] 

scala> new B() 
res22: B = [email protected] 

Así que para estar en consonancia con este principio, infiere una lista de parámetros vacía antes de una lista de parámetros implícita (class D(implicit ...)).

scala> class C()(implicit a: Int = 0) 
defined class C 

scala> new C 
res23: C = [email protected] 

scala> new C() 
res24: C = [email protected] 

scala> new C()(0) 
res25: C = [email protected] 

scala> class D(implicit a: Int = 0) 
defined class D 

scala> new D 
res26: D = [email protected] 

scala> new D() 
res27: D = [email protected] 

scala> new D()(0) 
res28: D = [email protected] 
Cuestiones relacionadas