Type mismatch: cannot convert von Klasse <..> Klasse <...>
Habe ich 'geerbt' ein Eclipse-RCP-Projekt, das scheint gut zu funktionieren mit einer Ziel-Plattform basiert auf 3.6. Aber vorwärts müssen wir ein update auf die neueste version der Plattform, aber wenn ich ändern Sie die target-Plattform auf 3,7 (oder 4.2), habe ich eine Handvoll von Fehlern, die entlang der Linien von
Type mismatch: cannot convert from Class<capture#1-of ?> to Class<? extends IDatasetProvider>
Kann jeder jeden schlagen/eine Erklärung, warum das so gut funktioniert in 3.6, nicht aber in 3.7 (und später)? Irgendwelche Ideen, wo ich anfangen würde bei der Lösung dieses wäre auch toll!
Einen Ausschnitt aus dem code, der diesen Fehler verursacht (erscheint am.b.loadClass Teil):
List<Class<? extends IDatasetProvider>> list = new LinkedList<Class<? extends IDatasetProvider>>();
ClassMap<IDatasetProvider, List<String>> map = new ClassMap<IDatasetProvider, List<String>>();
for (IConfigurationElement e : elements)
{
try
{
Bundle b = Platform.getBundle(e.getContributor().getName());
String viewId = e.getAttribute("viewId");
Class<? extends IDatasetProvider> datasetType = b.loadClass(e
.getAttribute("datasetProvider"));
...
...
...
}
}
Gibt es auch 3 (möglicherweise) verbundene Warnungen
IDatasetProvider is a raw type. References to generic type IDatasetProvider<T> should be parameterized
Wenn ich zurück zu unserer 3.6-Plattform, es funktioniert alles wieder.
EDIT: behoben Dank der Hilfe von Alexy und gzukmin.
Ich verwendete den folgenden code, speziell casting zu Class<? extends IDatasetProvider>
anstatt nur Class
:
Class<? extends IDatasetProvider> datasetType =
(Class<? extends IDatasetProvider>) b.loadClass(e.getAttribute("datasetProvider"));
Wenn es aus irgendeinem Grund sollte ich sollten Sie nur Gießen, um die generische Class
, lassen Sie es mich bitte wissen!
loadClass
Signatur der Methode.Meinst du den:
Class<?> loadClass(String name) throws ClassNotFoundException;
Linie von der org.osgi.Rahmen.Bundle-Klasse?Verwenden Sie die gleiche Java-version unter 3.6, 3.7 und 4.2?
Genau. Also, versuchen Sie weisen eine
Class<?>
Objekt der Class<? extends IDatasetProvider>
variable, die produzieren Fehler (nehme ich an). Dies ist, weil Class<?>
ist kein Subtyp von Class<? extends IDatasetProvider>
. Mai werden in der vorherigen version Class<?>
war ein rawtype Class
und statt Fehler-compiler erzeugt Warnungen, die ignoriert wurden.Es ist JDK 1.6 / JRE6 für alle Versionen von eclipse.
InformationsquelleAutor Jonny | 2012-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nur werfe es roh geben wie diese:
Beachten Sie dies:
Fügen Sie mehrere Warnungen über die raw-Typen und deaktiviert wirft.
Schlag bis auf die Laufzeit, wenn Ihre Klasse tatsächlich stellt sich heraus, nicht zu verlängern
IDatasetProvider
. Und nicht auf der cast-Lage, aber später, wenn Sie versuchen, um tatsächlich die Klasse. So könnte es eine gute Idee zu überprüfen, diese mit(siehe Javadoc).
Class<? extends IDatasetProvider>
- und ausschalten unchecked cast Warnung mit@SuppressWarning("unchecked")
. Es wird die gleiche Wirkung haben wie code, die Sie vorgeschlagen, aber ohne raw-TypClass
- und eine Warnung vom compiler. Und wie wollen Sie überprüfen, ob die Klasse tatsächlich erstreckt sichIDatasetProvider
?Ja, Sie können
@SuppressWarning
in beiden Fällen. Sie haben noch die Warnung über die raw-TypIDatasetProvider
wenn Sie Stimmen, umClass<? extends IDatasetProvider>
. Wenn casting zuClass<? extends IDatasetProvider<?>>
kompiliert, es würde wirklich besser sein. Siehe editiert Antwort auf die Letzte Frage.Diese Lösung ist sehr schön! Ich habe ganz vergessen über
isAssignableFrom
Methode. Ich denke, dass diese Methode ist sehr nützlich, wenn eine Klasse nicht generisch.Vielen Dank für die Antwort/Anleitung, die ich jetzt endlich umgesetzt. Es wurde die Frage bearbeitet, gehören die Lösung, die ich verwendet...
Anstatt zu werfen, um die raw-Typ
Class
es wäre besser, verwendenb.loadClass(e.getAttribute("datasetProvider")).asSubclass(IDatasetProvider.class)
, die (a) nicht erfordern ein explizites " cast, (b) erzeugt keine Warnungen und (c) fail-fast mit einemClassCastException
wenn die Klasse geladen wird, die nicht eine Umsetzung vonIDatasetProvider
.InformationsquelleAutor Alexey Romanov