Scala學習筆記3--類型推演

Scala類型推演


變量類型推演

scala會在編譯時爲變量提供類型推演,包括容器

var year: Int = 2009
var anotherYear = 2009
var greet = "Hello there"
var builder = new StringBuilder("hello")
var my_list = new ArrayList[Int]

import

scala中import語句裏的下劃線,等價於Java裏的*。import java.util._,會導入java.util包中所有的。如果下劃線不是跟在包名後,而是類名後,會導入類的所有`成員

容器類型

var list1 = new ArrayList[Int]
var list2 = new ArrayList
var list3 = new ArrayList[Any]
list2 = list1 //錯誤
list3 = list1 //錯誤

list2實際上創建了一個ArrayList[Nothing],在scala中Nothing是所有類型的子類,Any是所有類型的基類。默認情況下,Scala要求賦值兩邊的容器類型相同。

Any和Nothing

Any是所有類型的基類,擁有如下方法=()、==()、asInstanceOf()、equals()、hashCode()、isInstanceOf()和toString()。
Nothing是所有類型的子類,其作用就是類型推演的幫手(不用顯示去聲明一個Nothing實例)。拋出異常的返回類型就是Nothing。

Option類型

scala可以使用Option類型表示返回結果是否存在,使用Option的子類型實例Some[T]None表示存在和不存在。調用返回Option的getOrElse()方法檢測是否存在。

val resutl = if(1==2) Some("result exists") else None
print( resutl.getOrElse("resutl not exists") )

返回值類型推演

如果用等號(=)定義方法,Scala就可以推演返回類型。否則,它就假設方法返回void。如果申明的返回類型與實際返回結果不兼容,則會在編譯時報錯。

def method1() { 6 }
def method2() ={ 6 }
def method3() = 6
def method4 : Double = 6

可變參數

scala使用*定義可變參數,可變參數在方法中被當做數組使用

def max(values: Int*) = values.foldLeft(values(0)) { Math.max }
val numbers = Array(2, 5, 3, 7, 1, 6)
println(max(2, 5, 3, 7, 1, 6))
println(max(numbers: _*))

使用_*將數組擴展成離散值

容器協變

  • 通過<:>:在方法定義裏控制方法的參數
class Pet(val name: String) {
    override def toString() = name
}

class Dog(override val name: String) extends Pet(name){...}

def playWithPets[T <: Pet](pets: Array[T]) = {
    println("Playing with pets: " + pets.mkString(", "))
}

def copyPets[S, D >: S](fromPets: Array[S], toPets: Array[D]) = { ...}
  • 通過+控制自定義的容器協變
class MyList[+T] 
var list1 = new MyList[int]
var list2 : MyList[Any] = null
list2 = list1 // OK
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章