How does curly braces following trait instantiation work?

后端 未结 3 1280
旧时难觅i
旧时难觅i 2020-12-17 11:01

I find some confusing use of trait in some unittesting code, such as:

trait MyTrait {
  val t1 = ... //some expression
  val t2 = ... //some expression
}
         


        
3条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-17 11:11

    You are not instantiating the traits: traits by themselves cannot be instantiated; only non-abstract classes can. What you are doing here is using Scala's shorthand for both defining an anonymous/nameless class that extends the trait and instantiating it in the same statement.

    val anonClassMixingInTrait = new MyTrait {
      def aFunctionInMyClass = "I'm a func in an anonymous class"
    }
    

    Is the equivalent of:

    class MyClass extends MyTrait {
      def aFunctionInMyClass = "I'm a func in a named class"
    }
    
    val namedClassMixingInTrait = new MyClass
    

    The difference is you can only instaniate that anonymous class at the time of definition since it doesn't have a name and it can't have constructor arguments.

提交回复
热议问题