类型不匹配:无法从Class <..>转换为Class <...>

Jon*_*nny 1 java eclipse-rcp

我已经'继承了'一个Eclipse RCP项目,它似乎可以在基于3.6的目标平台集上运行良好.但是,我们需要更新到平台的最新版本,但是当我将目标平台更改为3.7(或4.2)时,我会遇到一些错误.

Type mismatch: cannot convert from Class<capture#1-of ?> to Class<? extends IDatasetProvider>
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议/解释为什么这可能在3.6中正常工作,但在3.7(及更高版本)中没有?关于我将从哪里开始解决这个问题的任何想法也会很棒!

导致此错误的代码片段(出现在b.loadClass部分):

    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"));
            ...
            ...
            ...
        }
     }
Run Code Online (Sandbox Code Playgroud)

还有3个(可能)相关的警告

 IDatasetProvider is a raw type. References to generic type IDatasetProvider<T> should be parameterized 
Run Code Online (Sandbox Code Playgroud)

如果我改回我们的3.6平台,那一切都会再次运作.

编辑:感谢Alexy和gzukmin的帮助.

我使用了以下代码,特别是强制转换Class<? extends IDatasetProvider>而不仅仅是Class:

Class<? extends IDatasetProvider> datasetType = 
    (Class<? extends IDatasetProvider>) b.loadClass(e.getAttribute("datasetProvider"));
Run Code Online (Sandbox Code Playgroud)

如果有任何理由我应该考虑选择更通用Class,请告诉我!

Ale*_*nov 5

您可以将其转换为原始类型,如下所示:

Class<? extends IDatasetProvider> datasetType = 
    (Class) b.loadClass(e.getAttribute("datasetProvider"));
Run Code Online (Sandbox Code Playgroud)

请注意这将:

  1. 添加有关原始类型和未选中的强制转换的更多警告.

  2. 如果你的类实际上没有扩展,那么在运行时爆炸IDatasetProvider.而不是在演员阵容,但后来当你尝试实际使用该类.因此,检查这个可能是个好主意

    IDatasetProvider.class.isAssignableFrom(datasetType)
    
    Run Code Online (Sandbox Code Playgroud)

(见Javadoc).

  • @jonny而不是强制转换为原始类型`Class`,最好使用`b.loadClass(e.getAttribute("datasetProvider")).asSubclass(IDatasetProvider.class)`,它将(a)不需要显式如果加载的类不是`IDatasetProvider`的实现,则不会生成任何警告和(c)使用`ClassCastException`快速失败. (3认同)