http://blog.csdn.net/yhb315279058/article/details/50242247
后置一元操作符:后置一元操作符就相當(dāng)于普通的無(wú)參方法。 |
前置一元操作符:前置操作符被默認(rèn)轉(zhuǎn)成對(duì)名為 unary_操作符 的方法調(diào)用,例如:-a和a.unary_-一樣 |
隱式轉(zhuǎn)換:例子: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) }}黃底部分用了隱式轉(zhuǎn)換 |
隱式參數(shù):隱式參數(shù)的作用其中一個(gè)就是提供默認(rèn)值,例如: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) }}隱式類直接用來(lái)增強(qiáng)類的功能。 |
隱式對(duì)象: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")))}}這個(gè)的用途還不是特別了解 |
在Scala中,
1) 可以用override val 覆蓋父類或特質(zhì)中不帶參數(shù)的def , 但反過(guò)來(lái)不行, 比如
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 } |
個(gè)人認(rèn)為這條規(guī)則可以這么記憶,因?yàn)閐ef表示一個(gè)函數(shù),函數(shù)返回值都有一個(gè)確定的范圍,比如上面的name函數(shù),它的返回值范圍是全體的字符串,由于val 表示一個(gè)常量,值的范圍已經(jīng)卻確定,因此如果子類要覆蓋父類的同名成員,其值的范圍不能更寬泛, 否則就破壞了里氏代換原則。顯然, def 所蘊(yùn)含的范圍要比 val 廣(注: 這段話是我瞎說(shuō),只是方便記憶)
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 } |
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注