报告将使用 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);