类型边界
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。