首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Class.cast() 方法深度解析:類型轉換的「欺騙性」語義

     編輯:Java 綜合教學

方法簽名

public T cast(Object obj)

官方文檔解讀

將對象轉換為此 Class 對象表示的類或接口。若對象非 null 且非目標類型實例,拋出 ClassCastException。

關鍵代碼示例

class A { public static void show() { System.out.println("A.show()"); } }
class B extends A { public static void show() { System.out.println("B.show()"); } }

public class TestCast {
    public static void main(String[] args) {
        Object obj = new A();
        B b1 = new B();
        b1.show();  // 輸出:B.show()
        
        A a = new A();
        a = A.class.cast(b1);  // 核心:將 b1 轉為 A 類型引用
        
        System.out.println(obj.getClass());   // class A
        System.out.println(b1.getClass());    // class B
        System.out.println(a.getClass());     // class B  ← 關鍵!
    }
}

輸出結果

B.show()
class com.scot.effective.genericity.A
class com.scot.effective.genericity.B
class com.scot.effective.genericity.B

核心誤區揭秘

a = A.class.cast(b1) 真實語義:

  • 不是將 b1 轉換為 A 類型對象
  • 是將引用 a 的聲明類型視為 A,實際指向仍是 B 實例
  • 運行時 a.getClass() 依然返回 B

源碼實現

public T cast(Object obj) {
    if (obj != null && !isInstance(obj))  // 實例檢查
        throw new ClassCastException(cannotCastMsg(obj));
    return (T) obj;  // 直接強轉
}

適用邊界

  • 只能轉換當前類或其子類的實例
  • 本質是帶類型檢查的強制轉換,無運行時類型變更能力
  • 泛型擦除下的類型安全輔助方法

總結

Class.cast() 只是語法糖,提供編譯期類型安全,運行期仍遵循多態機制。切勿誤以為能改變對象實際類型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved