Abstract Type
traits and abstract classes 可以拥有抽象类型成员
trait Buffer {
type T
val element: T
}
class IntBuffer extends Buffer{
Type T = Int
val element = 1
}
COMPOUND TYPES
当你需要表示一个类是多个类的子类时,可以用到compound types,表示形式即为:A with B with C ... { refinement }
trait Cloneable extends java.lang.Cloneable {
override def clone(): Cloneable = {
super.clone().asInstanceOf[Cloneable]
}
}
trait Resetable {
def reset: Unit
}
//参数必须是Cloneable、Resetable的子类
def cloneAndReset(obj: Cloneable with Resetable): Cloneable = {
//...
}
SELF-TYPE
Self-Type有以下几种用途
-
给this取别名
class Self { self => //代表this指针 val data = "data" def foo = self.data + this.data }
-
在内部类中,改变外部类实例的引用名称
class Outer { out => val data= "data" class Inner { println(out.data) // 用outer表示外部类,相当于Outer.this v1 } }
-
对子类的约束
通过this: 类型 => 来重新赋值当前类,子类也必须同时集成该类型。
trait User { def username: String } trait Tweeter { this: User => // reassign this def tweet(tweetText: String) = println(s"$username: $tweetText") } class VerifiedTweeter(val username_ : String) extends Tweeter with User { // We mixin User because Tweeter required it def username = s"real $username_" }