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.
Zuerst möchten Sie wahrscheinlich eine vollständige generische Class
Dann hat das Java-System kein Problem mit
%Vor% Wie können wir classCI
bekommen? Wir können durch unkontrollierte Besetzung betrügen
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
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.