2016-02-18 7 views
8

Perché il codice seguente genera in un errore di compilazione:Perché impliciti che sono definiti in una caratteristica separata dopo che l'utilizzo ha generato un errore di compilazione?

class MyImplicit 

class FooTest extends ImplicitProvider { 

    def getImplicit(implicit i: MyImplicit) = i 

    getImplicit 
} 

trait ImplicitProvider { 
    implicit val myImplicit = new MyImplicit 
} 

L'errore di compilazione è:

could not find implicit value for parameter i: MyImplicit getImplicit 

Se mi muovo l'ImplicitProvider tratto di sopra della classe FooTest tutto funziona bene.

Compilare con scala 2.11.7 e sbt 0.13.9.

È questo comportamento previsto o un bug?

risposta

4

Questa sembra essere una "caratteristica". Dai un'occhiata ai commenti in this ticket.

Apparentemente questo comportamento è previsto quando il tipo di implicito non è specificato esplicitamente. Quindi puoi aggiustarlo aggiungendo un'annotazione di tipo al valore implicito.

class MyImplicit 

class FooTest extends ImplicitProvider { 

    def getImplicit(implicit i: MyImplicit) = i 

    getImplicit 
} 

trait ImplicitProvider { 
    implicit val myImplicit: MyImplicit = new MyImplicit 
} 
+0

E qual è il motivo di tale comportamento (funzionalità)? Ho letto qualcosa del tipo "In questo modo, evitiamo gli errori di riferimento ciclici". che non capisco subito .. –