-4

スーパークラスAと、Aを拡張するクラスB、C、およびDがあります。

class A {}
class B extends A {}
class C extends A {}
class D extends A {}

次に、次のようなリストがあります。

[B.class, C.class, D.class]

リストからランダムなアイテムを取得し、次のようにインスタンス化します。

Object obj = list.get(i).newInstance()

ここで、タイプ A のオブジェクトをパラメーターとして受け入れるメソッドに obj を渡す必要があります。

A a = (A) obj 

Javaが例外をスローします(InstantiationExceptionまたはIllegalAccessExceptionのいずれか、Androidスタジオはキャッチ内のブレークポイントで停止せず、キャッチからの例外に関する情報を保存しようとするとnullになるため、わかりません...)。

新しいオブジェクト型を動的に指定して obj をその型にキャストできない理由は理解していますが、それらがすべて共通の親を共有している場合、なぜ機能しないのかわかりません。

私が現在行っていることを修正する方法、または同様の方法で同じことを達成する方法を誰かが教えてくれますか?

ありがとう!/最大

4

3 に答える 3

2

結局、これは android studio のバグによるものでした。コードを書き直すと問題が修正され、この問題を再現できませんでした

将来の検索者が役立つと思われるその他の症状:

  • Android Studio は、catch ブロック内のブレークポイントで停止しませんでした
  • 例外に関する情報を catch 内に保存しようとすると、null が返されました (以下の例を参照)。

:

Exception ex = null;
try {
    // do something that raises an exception
    ex = new Exception();
} catch (Exception ex)  {
    ex = ex;
}
// ex == null

他の回答で指摘されているように、私の質問で説明していたことは、通常、例外を発生させません。

于 2013-09-06T12:49:07.010 に答える
1

コードは完全に正常に動作しているようです。私はあなたの質問を理解していません。

    package testplayground;

    import java.util.ArrayList;
    import java.util.List;

   class A {

    void print() {
        System.out.println("inside A");
    }
    }

   class B extends A {

        public void print() {
            System.out.println("inside B");
        }
    }

    class C extends A {

    public void print() {
        System.out.println("inside C");
    }
    }

    class D extends A {

    public void print() {
        System.out.println("inside D");
    }
}

public class TestPlayGround {

    public static void main(String[] args) {
        try {
            List<Class> list = new ArrayList<Class>();
            list.add(B.class);
            list.add(C.class);
            list.add(D.class);
            for (Class classObj : list) {
                Object obj = classObj.newInstance();
                A a = (A) obj;
                methodA(a);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void methodA(A a) {
        a.print();
    }
}

出力:-

インサイドB

Cの中

中D

于 2013-08-28T22:15:20.883 に答える