Incompatibilité de Type: impossible de convertir de Classe <..> Classe <...>

J'ai 'hérité' une Eclipse RCP projet qui semble bien fonctionner avec une plate-forme cible basée autour de 3.6. Cependant, aller de l'avant, nous avons besoin de mettre à jour vers la dernière version de la plate-forme, mais quand je change la plate-forme cible à 3,7 (ou 4.2), j'ai une poignée d'erreurs le long de la lignes de

Type mismatch: cannot convert from Class<capture#1-of ?> to Class<? extends IDatasetProvider>

N'importe qui peut suggèrent ou fournir une explication des raisons pour lesquelles cela peut bien fonctionner dans la 3.6, mais pas en 3,7 (et plus tard)? Toutes les idées quant à l'endroit où je voudrais commencer à résoudre ce serait aussi génial!

Un extrait du code de l'origine de l'erreur (qui apparaît à la b.loadClass partie):

    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"));
            ...
            ...
            ...
        }
     }

Il y a également 3 (peut-être) des avertissements liés à

 IDatasetProvider is a raw type. References to generic type IDatasetProvider<T> should be parameterized 

Si je revenir à notre 3.6 plate-forme, tout fonctionne à nouveau.

EDIT: merci fixe à l'aide d'Alexis et gzukmin.

J'ai utilisé le code suivant, plus précisément de la coulée de Class<? extends IDatasetProvider> plutôt que de simplement Class:

Class<? extends IDatasetProvider> datasetType = 
    (Class<? extends IDatasetProvider>) b.loadClass(e.getAttribute("datasetProvider"));

Si il n'y a aucune raison que je devrais envisager de simplement jeter le plus générique Class, s'il vous plaît laissez-moi savoir!

  • Je suppose qu'il va être divers pour voir loadClass signature de la méthode.
  • Entendez-vous le: Class<?> loadClass(String name) throws ClassNotFoundException; ligne à partir de l'organisation.osgi.cadre.La classe Bundle?
  • Êtes-vous d'utiliser la même version de Java sous 3.6, 3.7 et 4.2?
  • Exactement. Donc, vous essayez d'affecter un Class<?> objet de la Class<? extends IDatasetProvider> variable, qui produisent de l'erreur (je suppose). C'est parce que Class<?> n'est pas sous-type de Class<? extends IDatasetProvider>. Peut-être dans la version précédente Class<?> était un rawtype Class et au lieu de l'erreur du compilateur produit des avertissements ont été ignorés.
  • C'est JDK 1.6 / RE6 pour toutes les versions d'eclipse.
  • Vous avez été correct gkuzmin. Juste pour confirmer, dans la version 3.6/cible, loadClass n'a tout simplement retourner un rawtype Class.

InformationsquelleAutor Jonny | 2012-07-06