簡體   English   中英

Java中這兩種投射方式有什么區別?

[英]What is the difference between these two ways of casting in Java?

Java中這兩種投射方式有什么區別?

  1. (CastingClass) objectToCast;

  2. CastingClass.class.cast(objectToCast);

Class#cast(Object)的來源如下:

public T cast(Object obj) {
if (obj != null && !isInstance(obj))
    throw new ClassCastException();
return (T) obj;
}

因此, cast基本上是強制轉換操作的通用包裝器,但我仍然不明白為什么你需要一個方法。

您只能將第一個表單用於靜態鏈接的類。

在許多情況下,這還不夠 - 例如,您可能已經使用反射獲取了類實例,或者它已作為參數傳遞給您的方法; 因此第二種形式。

因為你不能只寫(T)objectToCast ,當T是泛型類型參數時(由於類型擦除)。 Java編譯器會讓你這樣做,但是T將被視為Object ,所以即使你正在構建的對象不是T的實例,強制轉換也會一直成功。

這首先是普通演員。 它要求在編譯時知道要轉換的類型。 它驗證在編譯時,中投可能是正確的,並檢查(如果類型強制轉換為不通用),中投在運行時正確的。

第二個使用反射api。 它要求在運行時知道要轉換的類。 它在編譯時不驗證任何內容,但始終在運行時檢查強制轉換是否正確。

類型參數僅在編譯類型中已知,因此您不能將第二種方法用於類型參數(表達式T.class不編譯)。

動態加載的類(例如使用Class.forName(String))僅在運行時已知,因此不能使用第一種方法。

編輯:但是,正如Pavel指出的那樣,強制轉換為動態加載的類是沒有意義的。 我同意Class.cast(Object)唯一真正有用的是Class.cast(Object)為恰好有類對象可用的類型參數。

如果要轉換為的類型不包含類型參數,則第一種方法更好,因為額外的編譯時檢查可以捕獲錯誤,在運行時不會丟失類型安全性,並且需要更短的語法來引導。

在第一個中,您必須對鑄造類進行硬編碼。

( ClassToCast ) objectToCast;

在第二個中,鑄造類可能是一個參數:

Class toCast = getClassToCast();

toCast.cast( objectToCast );

在這里,您可以找到使用Class#cast()的用例。 它可能會給出新的見解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM