Object Everywhere
Is scala a pure object-oriented language?
Scala是一门纯的面向对象语言。
- Int/Boolean并没有在scala中受到特殊对待,它们都是定义在
package scala
中的class
-
Functions as Objects
所有function继承于FunctionN
的类(N
代表参数个数)
如
train Function1[-A, +B] {
def apply(x : A) : B
}
// 函数调用实则是调用apply函数
Polymorphism
两种形式构成多态
- subtyping
- generics
类型边界
- [S <: T] S是T的子类,T是一个上界
- [S >: T] T是S的父类,T是一个下界
- 混合边界,总和上述两个情况如:[S <: T1 >: T2]
里氏替换法则
if A <: B, then everything one can to do with a value of type B one should also be able to do with a value of type A.
Variance
举个例子,C[T]
是泛型类型,且存在类型 A <: B
,存在下面三种情况:
-
C[A] <: C[B]
代表 C是covariance,即协变。 -
C[A] >: C[B]
代表 C是contravariance,即逆变 - 如果C[A]和C[B]没有任何关系,代表C是invariance,即不变
下面是定义方式
// C是covariance
class C[+T] {}
// C是contravariance
class C[-T] {}
// C是invariance
class C[T] {}
一些要点
- 协变类型参数只可以出现在方法返回值类型
- 逆变类型参数只可以出现在方法参数类型
- 不变类型参数可以出现在任何地方
模式匹配
e match {
pattern1 => expr1
pattern2 => expr2
......
}
case class 会隐式定义伴生对象 with aplly method. 即
class Number(n : Int) {}
// implicitly
object Number {
def apply(n : Int) = new Number(n)
}
Lists
- list是不可变的
- Lists是递归的,Array是扁平的
- List和Array是同质的,即是说里面存的类型都应该是一样的