簡體   English   中英

為什么基於Class.class的轉換工作但不是getClass?

[英]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.classClass對象將使用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();

由於變量stringclassraw,因此將刪除依賴於泛型類型變量的方法的任何使用。

所以Class#cast(Object)現在有一個返回類型的Object ,它不能賦予String變量。

你做完了嗎

Class<? extends String> stringclass = thetype.getClass();

你沒事。

暫無
暫無

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

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