[英]Why does casting based on Class.class work but not getClass?
我有以下3個測試。 前兩個工作,最后一個沒有。 我提出這個問題的動機是,我希望能夠投射對象A
,使其與對象B
具有相同的類,當A
被認為是B
的子類型時。
@Test
public void testWorks() {
Object bar = "foobar";
String blah = (String) bar;
System.out.println(blah); // Outputs foobar
}
@Test
public void testAlsoWorks() {
Object bar = "helloworld";
String blah = String.class.cast(bar);
System.out.println(blah); // Outputs helloworld
}
@Test
public void testfails() {
Object bar = "foobar";
String thetype = "hello";
Class stringclass = thetype.getClass();
String blah = stringclass.cast(bar); // Compiler error: incompatible types: Object cannot be converted to String
System.out.println(blah);
}
任何人都可以解釋為什么最后一個案例在前兩個案例成功時失敗了,為什么會出現這種情況? 什么是更好的方法來實現這一目標?
您需要指定Class
的類型參數:
Class<String> stringclass = (Class<String>) thetype.getClass();
要么
Class<? extends String> stringclass = thetype.getClass();
java.lang.Class.cast(Object obj)
將對象強制轉換為此Class對象所表示的類或接口。
如果不指定類型,則不會告訴編譯器Class
實例stringclass
表示哪個類或接口。
調用String.class
, Class
對象將使用String
類型進行隱式參數化。
Java語言規范說明
C.class
的類型,其中C
是類,接口或數組類型(第4.3節)的名稱,是Class<C>
。
所以表達式的類型
String.class
是Class<String>
。 Class
是一個泛型類,其中方法cast
在其返回類型中使用泛型類型變量。 所以結果
String.class.cast(bar);
是T
類型的表達式,其中T
已在此調用中綁定到String
。
Object#getClass()
的返回類型是Class<? extends T>
Class<? extends T>
其中T
是它被調用的表達式的擦除類型。
在這種情況下,就是這樣
Class<? extends String>
但是,您將其分配給原始參考。
Class stringclass = thetype.getClass();
由於變量stringclass
是raw,因此將刪除依賴於泛型類型變量的方法的任何使用。
所以Class#cast(Object)
現在有一個返回類型的Object
,它不能賦予String
變量。
你做完了嗎
Class<? extends String> stringclass = thetype.getClass();
你沒事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.