10 Scala Abstract Type / Compound Type / Sefe Type

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有以下几种用途

  1. 给this取别名

    class Self {
     self =>   //代表this指针
     val data = "data"
     def foo = self.data + this.data
    }
    
  2. 在内部类中,改变外部类实例的引用名称

     class Outer {
       out =>
       val data= "data"
    
       class Inner {
         println(out.data) // 用outer表示外部类,相当于Outer.this
         v1
       }
     }
    
  3. 对子类的约束

    通过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_"
    }
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容