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