2017-07-08 65 views
0

我有以下的scala代码。我不明白为什么这些隐含的东西没有被编译器弄明白。我也尝试在Main中放置导入线。但请注意,隐式对象是内部主要创建时,那么代码正确运行Scala:无法从对象中找到隐式

import LoggingAddon._ 

object Main { 
    def main(args: Array[String]): Unit = { 
    val dog = new Dog 
    Util.act(dog) 
    } 
} 

class Dog { 
    def bark(): Unit = { 
    println("woof") 
    } 
} 

trait Action[A] { 
    def action(x: A): Unit 
} 

trait WithoutLogging[A] extends Action[A] { 
} 

trait WithLogging[A] extends Action[A] { 
} 

object LoggingAddon { 

    implicit object DogWithLogging extends WithLogging[Dog] { 
    override def action(x: Dog): Unit = { 
     println("before") 
     x.bark() 
     print("after") 
    } 
    } 
} 

object NoLoggingAddion { 

    implicit object DogWithoutLogging extends WithoutLogging[Dog] { 
    override def action(x: Dog): Unit = { 
     x.bark() 
    } 
    } 
} 

object Util { 
    def act(x: Dog)(implicit nolog: Action[Dog]): Unit = { 
    nolog.action(x) 
    } 
} 

我已经导入了必要的隐含从LoggingAddon但仍Scala编译器说:could not find implicit Action[Dog]

所有我想do做一个可插入的类型类。而不是改变任何一段代码,仅改变导入语句以具有不同的副作用

回答

2

只需移动,其中隐式导入使用顺序,我在下面的例子中

class Dog { 
    def bark(): Unit = { 
    println("woof") 
    } 
} 

trait Action[A] { 
    def action(x: A): Unit 
} 

trait WithoutLogging[A] extends Action[A] { 
} 

trait WithLogging[A] extends Action[A] { 
} 

object LoggingAddon { 

    implicit object DogWithLogging extends WithLogging[Dog] { 
    override def action(x: Dog): Unit = { 
     println("before") 
     x.bark() 
     print("after") 
    } 
    } 
} 

object NoLoggingAddion { 

    implicit object DogWithoutLogging extends WithoutLogging[Dog] { 
    override def action(x: Dog): Unit = { 
     x.bark() 
    } 
    } 
} 

object Util { 
    def act(x: Dog)(implicit nolog: Action[Dog]): Unit = { 
    nolog.action(x) 
    } 
} 

import LoggingAddon._ 
object Main { 
    def main(args: Array[String]): Unit = { 
    val dog = new Dog 
    Util.act(dog) 
    } 
} 
+0

移动至底部或使隐式类型显式化:'隐式val DogWithLogging:Action [Dog] = new WithLogging [Dog] {...}'。 –