1. type的作用
type是一种语法糖,class,trait,object会产生新的类型, 而type关键字用于对已有类型(或类型组合)提供别名
2. 复杂类型的抽象
将次要类型抽象为成员变量,方便判断对象是否为主要类型的投影
type T = Serializable{
// 针对次要类型X,type在内部提供占位符
type X
def foo():Unit
}
object A extends Serializable{
// 实例化时,将占位符指定为具体的类型,而不影响主要类型
type X = String
def foo(){}
}
typeOf[A.type] <:< typeOf[T] // true, 对象A的类型是类型T的投影,内部类型X是什么无关紧要
3. 作为成员变量使用
将参数类型抽象为成员变量,方便类型的统一管理
trait A{
// 定义T为成员变量
type T
// 类型T作为参数类型使用,且只需要在实例化时指定具体的T即可
def foo(i: T) = println(i)
}
// 本例中指定T为Int类型
// 在继承时指定T的具体类型
class B extends A {type T = Int}
val b = new B
b.foo(200)
// 在实例化时指定T的具体类型
class B extends A
val b = new B{type T = Int}
b.foo(200)
// 本例中指定T为String类型
// 在继承时指定T的具体类型
class C extends A {type T = String}
val c = new C
c.foo("hello")
// 在实例化时指定T的具体类型
class C extends A
val c = new C{type T = String}
c.foo("hello")
4. 与泛型的区别
如果使用泛型,则必需时刻保留泛型参数,直至指定具体类型为止
trait A[T]{
def foo(i: T) = println(i)
}
// 本例中指定T为Int类型
// 继承时指定T的具体类型
class B extends A[Int]
val b = new B
b.foo(200)
// 若不指定具体类型,则继承时保留泛型参数T
class B[T] extends A[T]
// 在实例化时指定具体类型T为Int
val b = new B[Int]
b.foo(200)
// 本例中指定T为String类型
// 继承时指定T的具体类型为String
class C extends A[String]
val c = new C
c.foo("hello")
// 在实例化是指定具体类型T为String
class C[T] extends A[T]
val c = new C[String]
c.foo("hello")