注解将元信息和定义关联起来。例如,注解方法前的@deprecated
会使得编译器在该方法被调用时打印一条警告。
1 | object DeprecationDemo extends App { |
上述代码可以通过编译但是编译器会打印一条警告:“there was one deprecation warning”。
注解子句用于其后的第一个定义或者声明。一个定义或者声明的前面可以出现不止一个注解子句,而它们的顺序并不重要。
注解将元信息和定义关联起来。例如,注解方法前的@deprecated
会使得编译器在该方法被调用时打印一条警告。
1 | object DeprecationDemo extends App { |
上述代码可以通过编译但是编译器会打印一条警告:“there was one deprecation warning”。
注解子句用于其后的第一个定义或者声明。一个定义或者声明的前面可以出现不止一个注解子句,而它们的顺序并不重要。
从类型S
到类型T
的隐式转换,由一个拥有函数类型S => T
的隐式值,或者一个可转换为指定类型的隐式方法所定义。
隐式转换适用于以下2中场景:
e
是S
类型的,且S
类型不能转换成表达式所期望的T
类型。S
类型的e
的选择器e.m
中,如果m
不是S
的成员。第一种场景中,会去查找一个适用于e
且其返回类型可以转换为T
的转换c
。
第二种场景中,则会去查找一个适用于e
且其返回结果包含了一个名为m
的成员的转换c
。
如果隐式方法List[A] => Ordered[List[A]]
和Int => Ordered[Int]
都在作用域内,那么对于下面两个List[Int]
类型的列表的操作是合法的:
自身类型是声明一个特质必须混入另外一种特质的方法,即使它并不继承。这使得不需要引入就可以使用依赖的成员。
自身类型可以缩短this
类型或者其他别名为this
的标识符。这种语法看起来像是普通的函数语法,但意思是完全不同的。
为了在特质中使用自身类型,需要写一个混入的其他特质的类型的标识符,以及一个=>
(例如someIdentifier: SomeOtherTrait =>
)。
有时候需要表达一个对象的类型是多个其他类型的子类型,在Scala中使用复合类型可以做到,这时它是多个类型的交集。
假设已有2个特质Cloneable
和Resetable
:
1 | trait Cloneable extends java.lang.Cloneable { |
现在如果我们需要写一个函数cloneAndReset
,它接受一个对象,克隆并且重置它:
特质和抽象类可以拥有抽象类型的成员。这意味着具体的实现可以定义实际的类型,下面是示例:
1 | trait Buffer { |
这里我们定义了一个抽象的type T
,用来描述element
的类型。我们可以在抽象类中继承该特质,并为T
增加了一个类型上界使之更为具体。
在Scala中,可以在类中拥有别的类作为其成员。与Java语言中内部类是包含它的类的成员相反,Scala中这些内部类是绑定在它的外部对象上的。如果想要在混合属于不同图的节点的时候,编译器能够在编译时阻止我们,那么路径依赖类型(Path-dependent types)提供了一种方案。