2017-08-29 100 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」。我沒有聽說過Capture <>,我會查看它。 「分享ProblemN模型」是什麼意思? –

+0

問題的定義1,2,3是我的意思。 – nullpointer

回答

1

我可能是錯的,但據我所知,不意味着仿製藥被用作元類型(類),所以你可以做的是,聲明你的問題如下:

AbstractProblem problem; 

然後:

+2

這工作!這次我得到了一個不同的錯誤:P –

相關問題