我已经继承了一个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
,请告诉我们!
答案 0 :(得分:5)
您可以将其转换为原始类型:
Class<? extends IDatasetProvider> datasetType =
(Class) b.loadClass(e.getAttribute("datasetProvider"));
请注意:
添加有关原始类型和未选中的强制转换的更多警告。
如果您的班级实际上没有延伸IDatasetProvider
,那么会在运行时爆炸。而不是在演员阵容,但后来当你尝试实际使用该类。因此,使用
IDatasetProvider.class.isAssignableFrom(datasetType)
(见Javadoc)。