Scala 自身类型注释

Scala 自身类型注释

特质的 自我类型注解指该 特质的假定类型,在特质中,要使用的接收器。任何混入特质的具体类必须确保其自我类型符合混入的特质。这意味着使用自我类型不会将局部变量和方法暴露给其子类和子trait。对于将一个大类划分为几个特质是自类型最常见的用途。自类型是一种声明一个特质必须混入另一个特质或类的方式,即使它没有直接扩展它,这使得那些混入特质的依赖成员无需导入就可以使用。

要在特质中使用自我类型,请写下标识符_name,旁边是要混入的特质类型,后面是=>符号;如下所示。

语法

trait A{
    //statements
}
trait B{
    this: A => //here we can use methods & variables of trait A
}

让我们来讨论一些例子。

例子

// Scala Program that uses self type
trait with_powers
{ 
    var mind ="extra-ordinary"; 
      
}
trait without_powers
{
    var mind="ordinary";
}
trait person
{ 
    def brain();
}
  
// class extend trait
class extraordinary_person extends person
{   
    // reassign this
    this: with_powers => 
    override def brain() = println(s"super hero brain is mind!");
}
  
// class extend trait
class ordinary_person extends person
{   
    // reassign this
    this: without_powers => 
    override def brain() = println(s"normal human brain ismind.");
}
  
// Creating object
object GFG
{
    // Main method
    def main(args:Array[String])
    {
        val hero = new extraordinary_person() with with_powers;
        val mohan = new ordinary_person() with without_powers;
          
        //val mohan= new ordinary_person() with with_powers; ERROR
        //does not conform to ordinary_person's self type
        hero.brain();
        mohan.brain();
    }
}

输出:

super hero brain is extra-ordinary!.
normal human brain is ordinary.

在上面的例子中,我们创建了traits with_powers, without_powers和person。在这里,class extraordinary_person扩展了trait person。同样,class ordinary_person也扩展了trait person。通过使用这个trait name =>
val mohan= new ordinary_person() with with_powers; 显示一个错误,不符合ordinary_person的自我类型。

示例 :

// Scala Program that uses self type
trait A
{ 
    def x = 1;
}
  
// trait extend another trait
trait B extends A
{
    override def x = super.x * 5;
}
  
// trait extend another trait
trait C1 extends B
{
    override def x = 2;
}
  
// trait extend another trait
trait C2 extends A
{ 
    this: B=> override def x = 2; 
      
}
  
// Creating object
object GFG
{
    // Main method
    def main(args:Array[String])
    {
        println((new C1 with B).x);
        println((new C2 with B).x);
    }
}

输出:

2
10

这里,在上面的例子中,C2是一个抽象类型,C2的自我类型是B。((new C2 with B))符合C2的自我类型是B(this: B=>)所以,自我类型让你指定哪些类型的特征允许混合。

例子:

// Scala Program that uses self type
trait Being
{
    var name: String
    var age: Int
    var gender: String
}
  
// Creating trait
trait Sayings
{
    this: Being =>
    def greetings(greet: String) = println(s"name:greet");
    def info() = println(s"I am age years oldgender");
}
  
// extend both trait with single class
class Person(var r_name: String, var r_age: Int, 
                            var r_gender: String)
extends Sayings with Being
{
    var name = s"Person $r_name";
    var age = r_age;
    var gender = r_gender;
}
  
// Creating object
object GFG
{
    // Main method
    def main(args: Array[String])
    {
        val person = new Person("Lakshya", 24, "Male");
        person.greetings("hello, hi there!!");
        person.info();
    }
}

输出:

Person Lakshya: hello, hi there!!
I am 24 years old Male

在上面的例子中(this: Being => ),基本上意味着Being的变量name、age、gender现在在greetings和info方法的范围内,但没有暴露给任何其他子类或扩展它的trait。所以,一个自我类型指定了对任何具体类的要求,该类型的特质应该被混合在其中。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程