Scala 类型边界、内部类

类型边界

1 类型上限

Scala中,类型参数与抽象类型被类型边界所限制。类型边界限制了类型变量的具值,并且可能透露出一些有关类型成员的信息。

上限类型T <: A 声明,类型变量T为类型A的子类型。

# 定义类
abstract class Animal{
    def name: String
}
    abstract class Pet extends Animal{}

class Cat extends Pet {
    override def name: String = "Cat"
}

class Lion extends Animal {
    override def name: String = "Lion"
}

# 使用类型上界
class PetContainer[P <: Pet](p: P) {
    def pet:P = p
}

# 正常编译
val catContainer = new PetContainer[Cat](new Cat)

# 无法编译(未遵守类型边界)
val lionContainer = new PetContainer[Lion](new Lion)

2 类型下限

类型上限将类型参数可接受的类型限制为指定类型的子类型,类型下限将类型参数可接收的类型限制为指定类型的超类型。B >: A 表示类型参数B或抽象类型B为类型A的超类型。在大多数情况下,A将会成为类的类型参数,B将会成为方法的类型参数。

内部类

Scala中,可以令类作为类的成员。与类Java的语言不同,这些语言中内部类是封闭类的成员,Scala中的内部类绑定在外部对象上。

# 定义内部类
class Graph {
  class Node {
    var connectedNodes: List[Node] = Nil
    def connectTo(node: Node) {
      if (connectedNodes.find(node.equals).isEmpty) {
        connectedNodes = node :: connectedNodes
      }
    }
  }
  var nodes: List[Node] = Nil
  def newNode: Node = {
    val res = new Node
    nodes = res :: nodes
    res
  }
}

# 实例化内部类
val graph1: Graph = new Graph
val node1: graph1.Node = graph1.newNode

# 实例化内部类
val graph2: Graph = new Graph
val node3: graph2.Node = graph2.newNode

# 调用内部类方法(产生编译错误,改正此错误,可以尝试将Node类中使用的Node改为Graph:Node)
node1.connectTo(node3)      

note:内部类实例node1的类型是graph1.Node,而不是Graph.Node。

翻译源:Scala Tour

    原文作者:小黑王HK
    原文地址: https://blog.csdn.net/qq_32165041/article/details/83507348
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞