2017-05-18 3 views
1

Ich bin Laden der db-Treiber basierend auf Kommandozeilenparameter wie folgt aus:Wie generische Klasse vor der Instanziierung zu parametrisieren?

Class driverClass = null; 
try { 
    driverClass = Class.forName(dbDriver); 
catch(ClassNotFoundException e) { 
    // Print error message here 
} 

Später driverClass.newInstance() Ich nenne.

Wie kann ich vermeiden, dass die Nachricht

Klasse ist eine rohe Art. Verweise auf generische Art Class<T> sollte

parametrierbar Wenn ich Class<Driver> die Class.forName Teil beschwert sich über ein Typenkonflikt versuchen:

Mismatch Typ: Konvertierung von Class<capture#1-of ?> zu Class<Driver>

Das ist seltsam, wie kann ich die Klasse in der ersten Zeile korrekt parametrisieren?

+0

Die 'CLASS' durch den generischen Paramter beeinflusst, so dass Sie nicht nicht nötig beim Aufruf von 'forName()'. Haben Sie beim Aufruf von 'newInstance()' versucht zu parametrieren? – Turing85

+0

Warum verwenden Sie 'forName' an erster Stelle? Das ist nicht der richtige Weg, um einen Datenbanktreiber zu laden. –

+0

@LewBloch Nun, ich dachte, das wäre der richtige Weg, wie kann ich es besser machen? – Beginner

Antwort

1

Wenn ich Teil versuchen Klasse der Class.forName beschwert sich über eine Art Mismatch

Nun, wenn Sie den Namen der Klasse bei der Kompilierung wissen, warum die Klasse initialisieren forName verwenden, dies nur tun:

Class<Driver> driverClass = Driver.class; 

Wenn Sie die Klassennamen bei der Kompilierung nicht wissen, Sie einfach ein ? als Typ-Parameter setzen können:

Class<?> driverClass = null; 
3

Wenn Sie nun die genaue Klassennamen nicht kennen, können Sie ? als eine Art Sinn jede Klasse angeben, die Object erweitert:

Class<?> driverClass = Class.forName(dbDriver); 
+0

Dies kümmert sich nicht wirklich um das Problem, da Sie immer noch einen Raw-Typ instanziieren. Darüber hinaus wird von Code-only-Antworten abgeraten. Bitte erläutern Sie Ihre Lösung. – Turing85

Verwandte Themen