Overload constructor for Scala's Case Classes?

后端 未结 2 1217
轮回少年
轮回少年 2020-12-01 02:46

In Scala 2.8 is there a way to overload constructors of a case class?

If yes, please put a snippet to explain, if not, please explain why?

相关标签:
2条回答
  • 2020-12-01 03:06

    Overloading constructors isn't special for case classes:

    case class Foo(bar: Int, baz: Int) {
      def this(bar: Int) = this(bar, 0)
    }
    
    new Foo(1, 2)
    new Foo(1)
    

    However, you may like to also overload the apply method in the companion object, which is called when you omit new.

    object Foo {
      def apply(bar: Int) = new Foo(bar)
    }
    
    Foo(1, 2)
    Foo(1)
    

    In Scala 2.8, named and default parameters can often be used instead of overloading.

    case class Baz(bar: Int, baz: Int = 0)
    new Baz(1)
    Baz(1)
    
    0 讨论(0)
  • 2020-12-01 03:15

    You can define an overloaded constructor the usual way, but to invoke it you have to use the "new" keyword.

    scala> case class A(i: Int) { def this(s: String) = this(s.toInt) }
    defined class A
    
    scala> A(1)
    res0: A = A(1)
    
    scala> A("2")
    <console>:8: error: type mismatch;
     found   : java.lang.String("2")
     required: Int
           A("2")
             ^
    
    scala> new A("2")
    res2: A = A(2)
    
    0 讨论(0)
提交回复
热议问题