case对象和scala中的对象有什么区别吗?


当前回答

Case类与常规类的不同之处在于:

模式匹配支持 equals和hashCode的默认实现 序列化的默认实现 toString的一个更漂亮的默认实现,以及 它们从scala.Product中自动继承的少量功能。

模式匹配、equals和hashCode对于单例来说并不重要(除非你做了一些真正退化的事情),所以你基本上只是得到了序列化、一个漂亮的toString和一些你可能永远不会使用的方法。

其他回答

我们以前知道对象和“case类”。但是“case object”是两者的混合,即它是一个类似于对象的单例,并且在case类中有很多样板。唯一的区别是样板文件是为对象而不是类编写的。

Case对象不会与以下对象一起出现:

应用、取消应用方法。 这里没有复制方法,因为这是一个单例。 没有结构相等比较的方法。 也没有构造函数。

Case类与常规类的不同之处在于:

模式匹配支持 equals和hashCode的默认实现 序列化的默认实现 toString的一个更漂亮的默认实现,以及 它们从scala.Product中自动继承的少量功能。

模式匹配、equals和hashCode对于单例来说并不重要(除非你做了一些真正退化的事情),所以你基本上只是得到了序列化、一个漂亮的toString和一些你可能永远不会使用的方法。

这里有一个区别——case对象扩展了Serializable特性,所以它们可以被序列化。默认情况下,常规对象不能:

scala> object A
defined module A

scala> case object B
defined module B

scala> import java.io._
import java.io._    

scala> val bos = new ByteArrayOutputStream                                            
bos: java.io.ByteArrayOutputStream =  

scala> val oos = new ObjectOutputStream(bos)                                          
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@e7da60                   

scala> oos.writeObject(B)

scala> oos.writeObject(A)
java.io.NotSerializableException: A$

case对象隐式地带有方法toString、equals和hashCode的实现,但简单对象没有。 case对象可以序列化,而简单对象不能,这使得case对象作为Akka-Remote的消息非常有用。 在object关键字之前添加case关键字使对象可序列化。

scala> object foo

定义对象foo

scala> case object foocase

定义对象foocase

序列化的区别:

scala> foo.asInstanceOf[Serializable]

java.lang.ClassCastException: foo$不能强制转换到scala。可序列化的 ... 43省略

scala> foocase.asInstanceOf[Serializable]

res1: Serializable = foocase

toString的区别:

scala> foo

res2: foo。类型= foo$@7bf0bac8

scala> foocase

res3: foocase。Type = foocase