簡體   English   中英

java .cast方法的不同行為

[英]Different behavior of java .cast method

我有這段代碼(Child只是Object的空子)我不明白為什么最后一次調用沒有給出與第二次調用相同的結果

感謝幫助

public class App {
  void process(Object o) {
    System.out.println("I have processed an object");
  }

  void process(Child c) {
    System.out.println("I have processed a child");
  }

  public static void main (String[] args) {
    Object o = new Child();

    Class<?> cl = Child.class;  

    App app = new App();
    app.process(o);
    app.process(Child.class.cast(o));
    app.process(cl.cast(o));
  }
}   

輸出是

I have processed an object
I have processed a child
I have processed an object

很可能是因為cl的靜態類型是Class<?> (實際上是Class<Object> ),而Child.class的靜態類型是Class<Child> 編譯器選擇僅基於它看到的靜態類型調用的方法,而不是基於對象的實際類型。

所以聲明你的變量為

Class<Child> cl = Child.class;

應該給你你想要的結果。

您應該使用Java反射來執行此操作

public static void main(String[] args) {
    Object o = new Child();
    App app = new App();

    try {
        Method m = App.class.getMethod("process", o.getClass());
        m.invoke(app, o);

    } catch (Exception e) {
        e.printStackTrace();
    }
}: 

雖然你有一個Object容器,但輸出現在是: 我已經處理了一個子容器

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

當寫作時:

Class<?> cl = Child.class;  

T由Object重新定義,因此返回(Object)obj;

暫無
暫無

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

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