2017-08-29 3 views
1

私はこのようになりますディレクトリを持っている:Javaでは、事前に名前を知らずにクラスをロードするにはどうすればよいですか?

src 
| 
|__ProblemTester.java 
| 
|__problems 
    | 
    |__AbstractProblem.java 
    | 
    |__Problem1.java 
    | 
    |__Problem2.java 
    | 
    |__Problem3.java 

クラスのすべてがAbstractProblemを拡張します。私は、入力int nを受け取り、(テストフレームワークの一部として)ProblemN.javaのインスタンスを返す関数を持っています。これは可能ですか?

これまでの私のコード:(非常に粗い)

class ProblemTester { 

    Class<? extends AbstractProblem> problem; 

    ProblemTest(int number) throws IllegalArgumentException { 
     try { 
      problem = Class.forName("problems.Problem" + number); 
     } catch (ClassNotFoundException e) { 
      throw new IllegalArgumentException(String.format("Problem %d not found.", number)); 
     } 
    } 

残念ながら、これは私がこの問題を解決するにはどうすればよいのエラーにIncompatible types. Required: Class<? extends AbstractProblem>. Found: Class<capture <?>>.

を投げますか?このようなもののための既存のフレームワークはありますか?私は過去にgradleを使ったことがありますが、私はこの機能が欲しいと思うように自動的にクラスをロードするとは思わない。ありがとう。

+1

* Class.forName( "problems.Problem" + number); *はnumber = 1と評価されますか?あなたのパッケージ構造はどこにでも 'Capture <>'を反映しません。そして、あなたはProblemNモデルも共有しなければなりません。 – nullpointer

+0

私はそれが "problems.Problem1"と評価することを意図していました。私はキャプチャ<>について聞いていない、私はそれを探します。 「ProblemN modelsを共有する」とはどういう意味ですか? –

+0

問題1,2,3の定義は私が意味したものです。 – nullpointer

答えて

1

私が間違っていることが、私の知る限りジェネリックが(クラスに対して)メタ型として使用されることを意図していなかった知っているようなので、あなたが何ができるかで、あなたの問題を宣言する可能性があるとして:

AbstractProblem problem; 

次に:

Class clazz = Class.forName("Problem" + number); 
problem = (AbstractProblem) clazz.newInstance(); 
+2

これはうまくいった!今回は違うエラーが出ました:P –

関連する問題