Scala OOP 基础五

2017/11/14 Scala

Scala OOP 基础知识五

类型层次结构

类型层次结构图如下:
scala2 在scala 2.10前,scala所有的引用类型都混入了名为scalaobject的marker特征,scala2.11后,这个特征已经去掉了。

Predef

隐式转换

Predef定义了很多的隐式转换规则,如:

@inline implicit def byteWrapper(x:Byte)   =new Runtime.RichByte(x)
...
implicit def Integer2int(x:java.lang.Integer):Int = x.intValue//将Integer转为scala中的int类型,

其中@inline标记使得编译器对这个函数作内联。隐式转换是scala自动触发的,所以不用人工操作。只需要定义好转换规则就可以了。

定义类型

这个很简单,如下所示:

type Map[A,+B]  = collection.immutable.Map[A,B]//这种就是别名
type Set[A]  	= collection.immiutable.Set[A]
type Function[-A,+B] = Function[A,b]

条件检查

在测试时,predef定义了许多方法。如

def assert(assertion:Boolean) // not true ,throw exception
def assert(assertion:Boolean,message:=>Any) 
...

这种类似的东西还有很多,使用中熟悉熟悉就好了。

输入输出方法

predef中有四种简洁的形式

def print(x:Any):Unit 						//same line
def printf(format:String,xs:Any*):Unit		//same line
def println(x:Any):Unit						//new line
def println():Unit 							//empty line

对象的相等

在scala中,需要测试相等的类或者会作为Map的Key的类,都应该标记case关键字,让编译器处理其中的常见问题如hashCode函数。

equals

scala中equals关键字和java的不同,如果对象有相同的值,不必指向同一个对象。如:

val p1a = Person("Dean","W",29)
val p1b = Person("Dean","W",29)
val p2 = Person("Buck","T",30)

p1a equals p1b	//true
p1a equals p2	//false
null equals p1a //error
null equals null //error

== 和 !=

scala中==和!= 是方法,不是操作符。==和!=测试的是内容是否相等,不是引用是否相同。这点和C++,JAVA相反。

p1a == p1b //true
p1a == p1a //true
p1a == p2 //false
null == p1a //false
null == null //true , compiler warning
p1a != p1a //false
p1a != p1b //true
p1a != p2 //true
p1a != null //true
null != pa1 //true
null != null //false , cimpiler warning

eq和ne方法

这个方法只参AnyRef类型有定义。用来测试引用的相等性。eq的行为是赞同C++ ,JAVA的==操作符的。

p1a eq p1a //true
p1a eq p1b //false
p1a eq p2 //false
p1a eq null //false
null eq p1a //false
null eq null //true
pa1 ne p1a //false
p1a ne p1b //true
p1a ne p2 //true
null ne null //false

sameElements和数组相等

数组的比较不能用==,可以用sameElements。不过更加推荐用List而不是数组。 如:

Array(1,2) sameElements Array(1,2)	//true
Show Disqus Comments

Search

    Table of Contents