[英]what's the difference between those two ways to initialize fields in Java?
[英]What is the difference between these two ways of casting in Java?
Java中這兩種投射方式有什么區別?
(CastingClass) objectToCast;
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.