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