2017-08-29 2 views
1

Ich habe ein Verzeichnis, das wie folgt aussieht:Wie kann ich in Java Klassen laden, ohne den Namen im Voraus zu kennen?

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

Alle Klassen erweitern AbstractProblem. Ich möchte eine Funktion haben, die die Eingabe int n übernimmt und eine Instanz ProblemN.java (als Teil eines Test-Framework) zurückgibt. Ist das möglich?

Mein Code bisher: (sehr grob)

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)); 
     } 
    } 

Leider führt dies den Fehler Incompatible types. Required: Class<? extends AbstractProblem>. Found: Class<capture <?>>.

Wie kann ich dieses Problem beheben? Gibt es einen bestehenden Rahmen für so etwas? Ich habe in der Vergangenheit Großbuchstaben verwendet, aber ich glaube nicht, dass es Klassen automatisch lädt, wie ich diese Funktion gerne hätte. Vielen Dank.

+1

Was bedeutet * Class.forName ("problems.Problem" + Nummer); * für Zahl = 1 bewerten? Ihre Paketstruktur spiegelt nicht 'Capture <>' irgendwo wider. Und Sie sollten ProblemN-Modelle sowie – nullpointer

+0

teilen, die ich für "problems.Problem1" bewerten wollte. Ich habe noch nichts von Capture gehört. Ich werde nachsehen. Was meinst du mit "ProblemN-Modelle teilen"? –

+0

Definition von Problem1,2,3 ist was ich meinte. – nullpointer

Antwort

1

Ich könnte falsch sein, aber soweit ich weiß, Generics nicht als Meta-Typen verwendet werden, gemeint waren (für Klassen), also was Sie tun können, ist, erklären Sie Ihr Problem so:

AbstractProblem problem; 

und dann:

+2

Das hat funktioniert! Ich habe diesmal einen anderen Fehler: P –

Verwandte Themen