scala中的isInstanceOf和asInstanceOf


如果實例化了子類的對象,但是將其賦予了父類類型的變量,
在后續的過程中,又需要將父類類型的變量轉換為子類類型的變量,應該如何做?
Ø  首先,需要使用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] )
  }
}
 
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
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM