Typesafe forName-Klassenladevorgang

8

Wie rufe ich Class.forName() auf, wenn das Ergebnis ein generischer Typ ist? Normalerweise kann ich asSubclass() verwenden, aber hier ist der einzige Weg, wie ich es sehe, eine Besetzung, die irgendwie herausragt & amp; Bugs mich, wenn alles andere gut mit Generics typisiert ist.

Das Szenario sieht ungefähr so ​​aus:

Es gibt ein .jar mit einer Einstiegshauptklasse, die ein main() hat. Es braucht eine Option für einen Klassennamen (und einige andere, hier irrelevant). Die angegebene Klasse implementiert Callable<Integer> . Diese Klasse ist geladen, inited & amp; gestartet.

Hier ist ein Beispiel für das, was ich brauche:

%Vor%

Gibt es eine Möglichkeit, diesen Cast loszuwerden?

Verwenden von SE6.

    
TC1 01.06.2011, 07:42
quelle

1 Antwort

10

Zuerst möchten Sie wahrscheinlich eine vollständige generische Class

%Vor%

Dann hat das Java-System kein Problem mit

%Vor%

Wie können wir classCI bekommen? Wir können durch unkontrollierte Besetzung betrügen

%Vor%

Dies ist von Natur aus unsicher. Es muss externe Kräfte geben, um sicherzustellen, dass className wirklich ein Callable<Integer> ist. Zum Beispiel, wenn es ein Callable<String> ist, durchläuft das Programm alle Umwandlungen ohne irgendein Problem, und es explodiert nur viel später, wenn Integer call() aufgerufen wird, und die Fehlermeldung wird sehr irreführend sein.

Es ist in Ordnung, wenn eine Besetzung nicht statisch analysiert werden kann, um erfolgreich zu sein:

%Vor%

solange eine Ausnahme sofort ausgelöst wird, wenn der Cast zur Laufzeit fehlschlägt.

Um typsicher zu sein, müssen wir proaktiv den generischen Typ von className

prüfen %Vor%

Wir sind berechtigt, "unchecked" hier zu unterdrücken, weil die Implementierung prüft um sicherzustellen, dass, wenn className nicht wirklich eine Klasse bezeichnet, die Callable<Integer> implementiert, sofort eine Ausnahme auslöst genau da. Unsere Besetzung ist "überprüft", und das Programm ist typsicher.

    
irreputable 01.06.2011, 08:08
quelle

Tags und Links