open="true" 声明的服务转换为比服务接口更具体的类的代码。
如果服务在其 plugin.xml 注册中被标记为 "open",则可被其他插件使用不同的实现重写。 将此类服务转换为特定的实现类不安全,因为在运行时实际实例可能是不同的类,从而会导致 ClassCastException。
示例:
<!-- plugin.xml -->
<extensions defaultExtensionNs="com.intellij">
<projectService serviceInterface="com.example.MyService"
serviceImplementation="com.example.MyServiceImpl"
open="true" />
</extensions>
// 错误:将开放服务转换为特定实现
MyServiceImpl impl = (MyServiceImpl) project.getService(MyService.class);
改为仅使用声明的服务接口:
// 正确:使用服务接口
MyService service = project.getService(MyService.class);