值類型與通用特質是scala特性中一個特別知識點,需要工作使用中慢慢體會
通用特質
A universal trait is a trait that extends Any, only has def s as members, and does no initialization.
繼承自Any
的trait,內部成員只有def定義的方法,且沒有初始化語句。
值類型
首先看一個最簡值類型(官網)
class Wrapper(val underlying: Int) extends AnyVal {
def foo: Wrapper = new Wrapper(underlying * 19)
}
值類型都是要繼承AnyVal的,更多的情況下,值類型還會繼承通用特質
,如下:
trait Printable extends Any {
def print(): Unit = println(this)
}
//Wrapper是一個值類型,繼承了Printable通用特質
class Wrapper(val underlying: Int) extends AnyVal with Printable
val w = new Wrapper(3)
//因為繼承了普通特質的print方法,招致此處需要實例化Wrapper
w.print() // actually requires instantiating a Wrapper instance
總結
- Value類雖然沒有顯示的用
final
修飾,但是依然可以認為是final
類。
參考
1 官方文檔
2 Scala 的Value Class 和 Universal Traits
3 通用特質(universal traits)