Scala语法详解:特质 (Traits)

简介: Scala语法详解:特质 (Traits)

特质 (Traits) 用于在类 (Class)之间共享接口 (Interface)和字段 (Fields)。类似Java8的接口。 类和对象 (Objects)可以继承Trait,但Trait不能被实例化,因此特质没有参数。


定义

最简化的就是关键字trait+标识符:

trait HairColor

特征作为泛型类型和抽象方法非常有用。

trait Iterator[A] {
  def hasNext: Boolean
  def next(): A
}

扩展 trait Iterator [A] 需要一个类型 A 和实现方法hasNext和next。

使用


使用 extends 扩展Trait。然后使用 override 关键字实现trait里面的任何抽象成员:

trait Iterator[A] {
  def hasNext: Boolean
  def next(): A
}
class IntIterator(to: Int) extends Iterator[Int] {
  private var current = 0
  override def hasNext: Boolean = current < to
  override def next(): Int =  {
    if (hasNext) {
      val t = current
      current += 1
      t
    } else 0
  }
}
val iterator = new IntIterator(10)
iterator.next()  // returns 0
iterator.next()  // returns 1

这个类 IntIterator 将参数 to 作为上限。它扩展了 Iterator [Int],这意味着方法 next 必须返回一个Int。

子类型


凡是需要特质的地方,都可以由该特质的子类型来替换。

import scala.collection.mutable.ArrayBuffer
trait Pet {
  // 抽象字段
  val name: String
}
// name 由Cat和Dog的构造器实现
class Cat(val name: String) extends Pet
class Dog(val name: String) extends Pet
val dog = new Dog("Harry")
val cat = new Cat("Sally")
val animals = ArrayBuffer.empty[Pet]
animals.append(dog)
animals.append(cat)
// 调用pet.name的前提是它必须在特质Pet的子类型中得到了实现。
animals.foreach(pet => println(pet.name))
目录
相关文章
|
1月前
|
Java 程序员 编译器
Scala 基础语法
Scala 基础语法
32 2
|
7月前
|
程序员 Scala
scala的基础语法
scala的基础语法
68 3
|
7月前
|
分布式计算 Java Scala
Scala:面向对象、Object、抽象类、内部类、特质Trait(二)
Scala:面向对象、Object、抽象类、内部类、特质Trait(二)
99 0
|
7月前
|
大数据 Scala
大数据生态思维导图____2021最新最全Scala语法思维导图!(待更新)
大数据生态思维导图____2021最新最全Scala语法思维导图!(待更新)
60 0
|
Java 编译器 Scala
158 Scala基础语法
158 Scala基础语法
55 0
|
安全 Java 编译器
Scala语言入门:初学者的基础语法指南
作为一种在Java虚拟机(JVM)上运行的静态类型编程语言,Scala结合了面向对象和函数式编程的特性,使它既有强大的表达力又具备优秀的型态控制
97 0
|
Java Scala C++
Scala选择和循环语法
Scala选择和循环语法
60 0
|
SQL 分布式计算 Java
Scala基础语法
Scala基础语法
113 0
|
JavaScript 前端开发 Java
Scala语言入门以及基本语法
Scala语言入门以及基本语法
|
Java Scala
scala面向对象编程之trait特质
特质就像是java的implement,是scala中代码复用的基础单元,它可以将方法和字段定义封装起来,然后添加到类中与类继承不一样的是,类继承要求每个类都只能继承一个超类,而一个类可以添加任意数量的特质。特质的定义和抽象类的定义很像,但它是使用trait关键字
122 0
scala面向对象编程之trait特质