1

名前付きのクラスがある場合Widget、次のコードで新しいクラスを作成できます (多かれ少なかれ):

Class<?> widgetClass = Class.forName("Widget");
Widget widget = (Widget)widgetClass.newInstance();

しかし、インターフェース、Fruit、およびいくつかの具体的な実装 ( Apple、 、OrangeなどKiwi) がある場合はどうなるでしょうか。私が試してみると:

Class<?> fruitClass = Class.forName("Apple");
Fruit fruit = (Fruit)fruitClass.newInstance();

エラーが発生します:

果物は型に解決できません。

次のように明示的なキャストを削除すると:

Fruit fruit = fruitClass.newInstance();

別のエラーが発生します。

タイプの不一致: capture#2-of から変換できませんか? フルーツへ。

Fruitでは、どのように String を使用して、必要な適切なconcretion をインスタンス化するのでしょうか?

4

3 に答える 3

2

おそらく、Fruitインターフェースをインポートするのを忘れただけです。

import com.foo.bar.Fruit;

注:デフォルトのパッケージは絶対に使用しないでください。クラスは常にパッケージに入れてください。

その他の注意:クラスの名前が外部リソース(ファイル、データベースなど)から動的に読み取られないが、質問に示されているようにハードコーディングされている場合は、コンストラクターを呼び出すだけです。

Fruit f = new Apple();
于 2012-04-30T18:24:00.707 に答える
2

「フルーツをタイプに解決できません」というエラーメッセージは、インポート/ビルドパスが正しく設定されていないことを意味します。

それ以外の場合は、コードが正しいように見えます。

于 2012-04-30T18:24:19.937 に答える
1

コードに問題はありません。ただし、Fruitクラスはコンパイルクラスパスに含まれていないため、コンパイラエラーが発生します。

于 2012-04-30T18:24:11.623 に答える