Scalaのtrait
#scala
https://docs.scala-lang.org/ja/tour/traits.html
インスタンス化できないが、メソッドの型または実装とメンバー変数を持つことができるもの。
Javaのinterfaceと同じような使い方に加え、ミックスインでクラス合成するのに使われる。
withキーワードでインスタンス化時にミックスインすることもできる。
code:scala
case class User(name: String, age: Int)
// JSONに変換する機能を持つtrait
trait JsonSerializable {
def toJson: String
}
// Userクラスに後から機能をミックスイン
val user = new User("Taro", 30) with JsonSerializable {
def toJson: String = s"""{"name": "$name", "age": $age}"""
}
println(user.toJson) // """{"name": "Taro", "age": 30}""" と出力
インスタンス化できない、と言いつつ匿名クラスにミックスインする形ですぐ利用することもできる。
code:scala
scala> trait T
// defined trait T
scala> new T
-- E042 Type Error: ----------------------------------------------------------
1 |new T
| ^
| T is a trait; it cannot be instantiated
|
| longer explanation available when compiling with -explain
1 error found
scala> new T {}
val res10: T = anon$1@ac05a13