1

我已经“继承”了一个 Eclipse RCP 项目,该项目似乎适用于基于 3.6 的目标平台集。但是,继续前进,我们需要更新到平台的最新版本,但是当我将目标平台更改为 3.7(或 4.2)时,我遇到了一些错误,类似于

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

任何人都可以建议/解释为什么这在 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"));
            ...
            ...
            ...
        }
     }

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

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

如果我改回我们的 3.6 平台,一切都会再次运行。

编辑:在 Alexy 和 gzukmin 的帮助下修复。

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

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

如果有任何理由我应该考虑只转换为更通用的Class,请告诉我!

4

1 回答 1

5

您可以像这样将其转换为原始类型:

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

请注意,这将:

  1. 添加更多关于原始类型和未经检查的强制转换的警告。

  2. 如果您的类实际上没有扩展,则在运行时炸毁IDatasetProvider。而且不是在演员表位置,而是稍后当您尝试实际使用该课程时。所以检查这个可能是个好主意

    IDatasetProvider.class.isAssignableFrom(datasetType)
    

(参见Javadoc)。

于 2012-07-06T17:29:53.747 回答