我知道有一些关于案例类的计划更改,例如禁止它们之间的继承:
scala> case class Foo()
defined class Foo
scala> case class Bar() extends Foo()
<console>:9: warning: case class `class Bar' has case ancestor `class Foo'. Case-to-case inheritance has potentially dangerous bugs which are unlikely to be fixed. You are strongly encouraged to instead use extractors to pattern match on non-leaf nodes.
case class Bar() extends Foo()
^
defined class Bar
或没有参数列表的案例类(不确定):
scala> case class Foo
<console>:1: warning: case classes without a parameter list have been deprecated;
use either case objects or case classes with `()' as parameter list.
case class Foo
^
<console>:7: warning: case classes without a parameter list have been deprecated;
use either case objects or case classes with `()' as parameter list.
case class Foo
^
defined class Foo
目前@deprecated 还有什么?
最佳答案
Scala 中的每个类都必须至少有一个非隐式参数部分。如果您不包含一个,编译器会为您添加它。
scala> class X
defined class X
scala> new X()
res4: X = X@68003589
scala> class Y
defined class Y
scala> new Y()
res5: Y = Y@467f788b
案例类也不异常(exception)。但是与模式匹配的交互是混淆和错误的来源,这促使弃用。
scala> case class A
<console>:1: warning: case classes without a parameter list have been deprecated;
use either case objects or case classes with `()' as parameter list.
case class A
^
defined class A
scala> val a = A()
a: A = A()
scala> (a: Any) match { case A => 1; case _ => 2 }
res0: Int = 2
scala> val companion = A
companion: A.type = A
scala> (companion: Any) match { case A => 1; case _ => 2 }
res0: Int = 1
正如 Dean 建议的那样,通常最好用案例对象对此进行建模。
我不知道取消对空参数列表案例类的支持的时间表。案例类继承在 2.9.0 中几乎被删除,但已推迟到下一个主要版本。
进一步阅读:
Why can't the first parameter list of a class be implicit?
关于class - 在 Scala 2.9 之后,case 类的哪些内容将被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6002725/