Equinox改变了激活剂

时间:2012-01-24 13:57:16

标签: eclipse eclipse-rcp xslt equinox

我有一个我无法解决的问题。 我正在学习昼夜平分点变换,我无法解决这个问题,在我的Activator中我把这段代码:

Properties properties = new Properties();
properties.put("equinox.transformerType", "xslt"); //$NON-NLS-1$ //$NON-NLS-2$
registration = context.registerService(URL.class.getName(), context.getBundle().getEntry("/transform.csv"), properties); //$NON-NLS-1$

但Eclipse告诉我,registerService方法不能与那些参数(String,Url,Properties)一起使用,它只接受(String,Url,Dictionary)。 Equinox_Transforms中的示例使用的方法与我使用的方法相同,但在这些情况下它可以正常工作。

有什么问题?

我使用以下方法更改了Activator中的示例代码:

Dictionary properties = new Hashtable();
properties.put("equinox.transformerType", "xslt");
registration = context.registerService(URL.class.getName(), context.getBundle().getEntry("/transform.csv"), properties);

是不是?

2 个答案:

答案 0 :(得分:2)

您从Eclipse获得的编译错误,BundleContext类型中的registerService(String,Object,Dictionary)不适用于参数(String,URL,Properties)是正确的。 这是因为java中的泛型。 java.util.Properties 类扩展了Hashtable,它遵循通用规则。 现在,如果您看到BundleContext.reregisterService()

所期望的参数
ServiceRegistration<?> registerService(String clazz, Object service, Dictionary<String, ?> properties);

明确提到它期望第三个参数为Dictionary&lt; .String,?&gt; 。

因此,当您使用简单的属性时,它无法在编译时为第3个参数识别类型。

所以,你的第二种方法是正确的:

Dictionary properties = new Hashtable();
properties.put("equinox.transformerType", "xslt");
registration = context.registerService(URL.class.getName(),     
context.getBundle().getEntry("/transform.csv"), properties);

即使将字典引用更改为

,也可以进行检查
Dictionary<Object,Object> properties = new Hashtable();

它将再次为您提供相同的编译时间错误

您可以了解有关泛型here的更多信息。

您可以在Equinox Transform revealed上阅读有关Equinox Transform和示例示例的更多信息。

答案 1 :(得分:0)

当您使用Properties对象时,import语句是什么? 看起来您可能没有使用java.util.Properties(java.util.Dictionary的子类)。有很多名为Property的类。