http://blog.csdn.net/yhb315279058/article/details/50242247
后置一元操作符:后置一元操作符就相當于普通的無參方法。 |
前置一元操作符:前置操作符被默認轉成對名為 unary_操作符 的方法調用,例如:-a和a.unary_-一樣 |
隱式轉換:例子:class RichFile(val file:File){def read = Source.fromFile(file.getPath()).mkString}object Context{implicit def file2RichFile(file:File)= new RichFile(file) //File -> RichFile}object Hello_Implicit_Conversions {def main(args: Array[String]) {import Context.file2RichFilePRintln(new File("E://WangJialin.txt").read) }}黃底部分用了隱式轉換 |
隱式參數:隱式參數的作用其中一個就是提供默認值,例如:object Context_Implicits{implicit val default:String = "Flink"}object Param{def print(content:String)(implicit language:String){println(language+":"+content)}}object Implicit_Parameters {def main(args: Array[String]) {Param.print("Spark")("Scala")import Context_Implicits._Param.print("Hadoop")}} |
隱式類:代碼示例:object Context_Helper{ implicit class FileEnhancer(file : File){ def read = Source.fromFile(file.getPath).mkString }implicit class Op(x:Int){def addSAP(second: Int) = x + second}}object Implicits_Class {def main(args: Array[String]){import Context_Helper._println(1.addSAP(2))println(new File("E://WangJialin.txt").read) }}隱式類直接用來增強類的功能。 |
隱式對象:abstract class Template[T] {def add(x: T, y: T): T}abstract class SubTemplate[T] extends Template[T] {def unit: T}object Implicits_Object {def main(args: Array[String]) {implicit object StringAdd extends SubTemplate[String] {override def add(x: String, y: String) = x concat yoverride def unit: String = ""}implicit object IntAdd extends SubTemplate[Int] {override def add(x: Int, y: Int) = x + yoverride def unit: Int = 0}def sum[T](xs: List[T])(implicit m: SubTemplate[T]): T =if (xs.isEmpty) m.unitelse m.add(xs.head, sum(xs.tail))println(sum(List(1, 2, 3, 4, 5)))println(sum(List("Scala", "Spark", "Kafka")))}}這個的用途還不是特別了解 |
在Scala中,
1) 可以用override val 覆蓋父類或特質中不帶參數的def , 但反過來不行, 比如
class Father{
def name = "Archer"
def score() = 1.0
val id = 12 } class Children extends Father{
override val name = "Jack"
override val score = 2.0
override def id = 10 // error: error overriding value id in class Father of type Int; method id is not stable } |
個人認為這條規則可以這么記憶,因為def表示一個函數,函數返回值都有一個確定的范圍,比如上面的name函數,它的返回值范圍是全體的字符串,由于val 表示一個常量,值的范圍已經卻確定,因此如果子類要覆蓋父類的同名成員,其值的范圍不能更寬泛, 否則就破壞了里氏代換原則。顯然, def 所蘊含的范圍要比 val 廣(注: 這段話是我瞎說,只是方便記憶)
2. 子類的def 可以 override 父類的def, 比如
class Father{
def name = "Archer"
def say() = "go to bed"
def moveTo(x : Int, y : Int) = println( "move to (" +x+ "," +y); } class Children extends Father{
override def name() = "Jack"
override def say() = "I'm not tired"
override moveTo(x : Int, y : Int) = super .moveTo(x,y) } |
class Father{
def credit = "abc"
def credit _= (s : String) = (println( "s" )) } class Children extends Father{
override var credit = "fff" // var can override a dual def } |
新聞熱點
疑難解答