如果實例化了子類的對象,但是將其賦予了父類類型的變量,
在后續的過程中,又需要將父類類型的變量轉換為子類類型的變量,應該如何做?
Ø 首先,需要使用isInstanceOf 判斷對象是否為指定類的對象,如果是的話,則可以使用 asInstanceOf 將對象轉換為指定類型;
Ø 注意:p.isInstanceOf[XX] 判斷 p 是否為 XX 對象的實例;p.asInstanceOf[XX] 把 p 轉換成 XX 對象的實例
Ø 注意:如果沒有用isInstanceOf 先判斷對象是否為指定類的實例,就直接用 asInstanceOf 轉換,則可能會拋出異常;
Ø 注意:如果對象是 null,則isInstanceOf 一定返回 false, asInstanceOf 一定返回 null;
Ø Scala與Java類型檢查和轉換 Scala Java obj.isInstanceOf[C] obj instanceof C obj.asInstanceOf[C] (C)obj classOf[C] C.class
Ø 舉例說明:
package cn.itcast.extends_demo
class Person3 {}
class Student3 extends Person3
object Student3{
def main (args: Array[String] ) {
val p: Person3 = new Student3
var s: Student3 = null
//如果對象是 null,則 isInstanceOf 一定返回 false
println (s.isInstanceOf[Student3])
// 判斷 p 是否為 Student3 對象的實例
if (p.isInstanceOf[Student3] ) {
//把 p 轉換成 Student3 對象的實例
s = p.asInstanceOf[Student3]
}
println (s.isInstanceOf[Student3] )
}
}
class Student3 extends Person3
object Student3{
def main (args: Array[String] ) {
val p: Person3 = new Student3
var s: Student3 = null
//如果對象是 null,則 isInstanceOf 一定返回 false
println (s.isInstanceOf[Student3])
// 判斷 p 是否為 Student3 對象的實例
if (p.isInstanceOf[Student3] ) {
//把 p 轉換成 Student3 對象的實例
s = p.asInstanceOf[Student3]
}
println (s.isInstanceOf[Student3] )
}
}
Scala中getClass 和 classOf
Ø isInstanceOf 只能判斷出對象是否為指定類以及其子類的對象,而不能精確的判斷出,對象就是指定類的對象;
Ø 如果要求精確地判斷出對象就是指定類的對象,那么就只能使用 getClass 和 classOf 了;
Ø p.getClass 可以精確地獲取對象的類,classOf[XX]可以精確的獲取類,然后使用 == 操作符即可判斷;
Ø 舉例說明:
package cn.itcast.extends_demo
class Person4 {}
class Student4 extends Person4
object Student4{
def main(args: Array[String]) {
val p:Person4=new Student4
//判斷p是否為Person4類的實例
println(p.isInstanceOf[Person4])//true
//判斷p的類型是否為Person4類
println(p.getClass == classOf[Person4])//false
//判斷p的類型是否為Student4類
println(p.getClass == classOf[Student4])//true
}
}
class Student4 extends Person4
object Student4{
def main(args: Array[String]) {
val p:Person4=new Student4
//判斷p是否為Person4類的實例
println(p.isInstanceOf[Person4])//true
//判斷p的類型是否為Person4類
println(p.getClass == classOf[Person4])//false
//判斷p的類型是否為Student4類
println(p.getClass == classOf[Student4])//true
}
}