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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值