1

私はこのコードを持っています (Child は Object の単なる空の子です) が、最後の呼び出しが 2 番目の呼び出しと同じ結果をもたらさない理由がわかりません

手伝ってくれてありがとう

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
4

3 に答える 3

3

おそらく、の静的タイプclClass<?>(事実上Class<Object>)であるのに対し、の静的タイプChild.classはですClass<Child>コンパイラーは、オブジェクトの実際のタイプではなく、表示される静的タイプのみに基づいて呼び出すメソッドを選択します。

したがって、変数を次のように宣言します

Class<Child> cl = Child.class;

期待した結果が得られるはずです。

于 2012-09-11T08:15:00.507 に答える
1

これを行うには、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();
    }
}: 

オブジェクト コンテナーがありますが、出力は次のよう になります。

于 2012-09-12T08:21:08.233 に答える
0
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
    throw new ClassCastException();
return (T) obj;
}

これによって書かれたとき:

Class<?> cl = Child.class;  

T は Object に置き換えられるため、(Object)obj を返します。

于 2012-09-11T08:26:05.563 に答える