2

私は次のクラスを持っています。

abstract class A{}

class B extends A{}

class C extends A{}

このようなオブジェクトを作成する必要があります

A a = new B();

実行時にサブクラスのクラス名を取得します。そのため、リフレクションを使用してオブジェクトを作成する必要があります。

私はこれをしました。

Class<?> klass = Class.forName(className);

現在、このクラスをサブクラスにキャストできません。

達成したい

A a = klass.newInstance(); // returns Object

オブジェクトをサブクラスにキャストしたい (BまたはC、実行時に決定)

どうすればいいですか?

4

4 に答える 4

3

Generics を使用して宣言できます

Class<? extends A> klass;

その後、書き込みが許可されます

A a = klass.newInstance();

ただし、Class.forNameクラスに関する型情報がなく、型推論が宣言されていないため、「チェックされていないキャスト」の警告が表示されます。このアプローチは、2 行目の結果を にダウンキャストするだけで、タイプセーフではありませんA

于 2013-06-26T13:37:53.870 に答える
2

オブジェクトをサブクラスにキャストしたい (実行時に決定される B または C のいずれか)

それは意味がありません。キャストは、主にコンパイル時の操作であり、最終的に適切な型の式になります。その後、実行時に検証されます。

タイプ の変数を実際に実現しようとしている場合は、次のAようにキャストするだけで済みますA

A a = (A) klass.newInstance();
于 2013-06-26T13:36:25.873 に答える
1

メソッドを呼び出して型にキャストできるklass型のオブジェクトを持つClass<T>Class.cast()T

klass.cast(object)

たとえば、atypeがあり、実行時にロードされる型Bにキャストします。aB

Class<?> klass = Class.forName("B");
klass.cast(a);
于 2013-06-26T13:39:14.823 に答える
0

コメントをフォローアップするには、次のいずれかを使用してクラスのインスタンスを作成できます

Class klass = Class.forName(className);
A a = (A)klass.newInstance();

また

Class<? extends A> klass = Class.forName(className);
A a = klass.newInstance();

次に、次の方法でメソッドを呼び出すことができます。

klass.getMethod(methodName, null).invoke();

または、メソッドが引数を取る場合 (例: intand String)

int param1 = ...;
String param2 = ...;
klass.getMethod(a, new Class[] { Integer.class, String.class }).invoke(param1, param2);

もちろん、適切な例外をキャッチする必要があります。

于 2013-06-26T13:45:19.603 に答える