1. 结构类型
仅抽象声明,类似匿名类,实际类型为AnyRef,由大括号包围,包含抽象函数、抽象字段的代码
例如:{val name:String}
2. 预定义(early initalizers)
包含具体实现,类似代码块,由大括号包围,在构造函数之前执行,包含函数具体实现、变量命名的代码
例如{val name:String = “lijp”}
3. 举例
// 结构类型
trait A extends {val name:String} 等价于 trait A extends AnyRef{val name: String}
// 预定义
trait A extends {val name:String = "lijp"}
// 结构类型
class A extends {val name:String} 等价于 class A extends AnyRef{val name: String}
// 预定义
class A extends {val name:String = "lijp"}
4. 结构类型需要注意的问题
// 简单情形
def test(t: {def close[T](c: T)}) = println("ok")
test(t: new {def close[String](c: String) = println("structure type")})
// 结构类型的参数类型需要外部提供类型参数,报错:结构类型中的参数类型不能引用外部的泛型类型
def test[T](t: {def close(c:T)}) = println("ok")
test[String](t: new {def close(c: String) = println("parameter need outter type")}) // error: Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
// 结构类型的结果类型需要外部提供类型参数,正常编译运行
def test[T](t: {def close():T}) = println("ok")
test[String](t: new {def close():String = "result need outter type"})