Diese Zeile nicht kompiliert:
test(E1.class,E2.class);
Es gibt nur einen Typ-Parameter ist E
und Java müssen die abgeleiteten Typen der Argumente genau übereinstimmen. Es kann Example
nicht abgeleitet werden, da die Objekte Class<E1>
und Class<E2>
, nicht Class<Example>
sind. Die Invarianz von Java-Generika verhindert dies.
Sie können durch die Einführung einer Obergrenze Wildcard auf test
‚s generischen Typparameter dieses Problem umgehen:
public static <E extends Example> void test(Class<? extends E>... es)
Dies ermöglicht Java Example
für E
, zu schließen, indem die obere Grenze Wildcard mit E1
und E2
erfüllen.
In der zweiten Zeile wird ein unformatiertes Array von Class
Es erstellt, wobei Generika umgangen werden und eine Warnung "Ungeprüfter Aufruf" generiert wird.
new Class[]{E1.class,E2.class}
Wenn Sie eine Art Argument Class
hier zur Verfügung zu stellen, um zu versuchen, würden Sie einen Compiler-Fehler mit jedem halbwegs vernünftigen Art Parameter erhalten:
// Needs Class<Example> but found Class<E1> and Class<E2>
test(new Class<Example>[]{E1.class,E2.class});
// Needs Class<E1> but found Class<E2>
test(new Class<E1>[]{E1.class,E2.class});
// Needs Class<E2> but found Class<E1>
test(new Class<E2>[]{E1.class,E2.class});
Satisfying den Schluss über einen Platzhalter Hier wird nur das eigentliche Problem aufgedeckt - generische Array-Erstellung.
// Generic array creation
test(new Class<? extends Example>[]{E1.class,E2.class});
Vielen Dank. Es war nie schädlich für mein Programm, aber ich habe mich definitiv eine Weile an den Kopf gekratzt. Ich schätze die Aufklärung sehr. – Squirvin