一、显式变量:定义变量时申明变量类型
比如: var myVar:String;
变量未赋值之前不能使用
一旦变量类型申明后,不能再赋值其他类型的值
但可以用其他类型重新申明变量,比如var myVar:Int,但最好不要这样做
二、函数变量
函数public function outputString(st : String) : Void;的类型为String->Void
public function sumAndCeil(a : Float, b : Int) : Int类型为Float->Int->Int
public function filter(f : String->Bool) : List<String>类型为(String->Bool)->List<String>
public function takesStringReturnsFunction(s : String) : String->Bool类型为String->(String->Bool)
三、动态函数
函数和静态函数都可以设置为动态,这样在运行时,可以重新设置函数的值,但类型必须一致。
动态函数只能设置在类的实例上,静态函数只能设置在类上,另外动态函数不能重载,也不能用super
public dynamic function saySomething()
public static dynamic function saySomething()
四、匿名对象
var obj: { id:Int, name:String } = { id:10, name:"Name" };
五、Duck Typing:如果某个类里面有匿名对象里的所有成员变量,这此类可以赋值给匿名变量
class DuckType
{
public var id:Int;
public var name:String;
public function new(id:Int, name:String)
{
this.id = id;
this.name = name;
}
}
var obj: { id:Int, name:String } = new DuckType(10, "Name“);
六、隐式变量
申明变量时不指定类型,由编译器判断其类型(第一次赋值时)
七、类型转换
1. 安全转换
var a : A; var b : B; b = cast(a, B);//如果a不是B类型,运行时会出错
2. 非安全转换
var i : Int; i = cast "Hello";//可以将任意类型的变量转换为被赋值变量的类型,但如果不能转换时,会报运行时错误
3. untyped
untyped { myVar.doSomething();}//此时编译器不会检查类型,但可能产生运行时错误
八、模板类
1. class Array<T>
2. class Fridge<T: (Fruit, Eatable)>//T必须是Fruit和Eatable类型