【问题标题】:Eclipse plugin - what is the benefit of using Adapter instead of a cast?Eclipse 插件 - 使用适配器而不是强制转换有什么好处?
【发布时间】:2014-10-23 21:38:41
【问题描述】:

如果您选择 IStructuredSelection 项目,使用 .toArray() 来获取它们的 Object[]-content,那么为什么将每个 Object 转换为 IAdaptable 然后再次转换为 IJavaProject 对我来说很好,我得到了所有类/接口及其方法....

但是当使用 (IJavaProject) adaptable.getAdapter(IJavaProject.class) 时,一些接口方法会丢失?

适配器到底做了什么(除了“返回一个作为给定类参数实例的对象......”)以及为什么每个人都建议使用它而不是强制转换?这是相关代码

    IAdaptable adaptable = (IAdaptable) selectedObject;
    IJavaProject javaProject = (IJavaProject) adaptable.getAdapter(IJavaProject.class);
    final IProject iProject = javaProject.getProject();
    iProject.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
    final IJavaProject javaRefreshedProject = JavaCore.create(iProject);
    //processing further using ASTParser and CompilationUnit

【问题讨论】:

    标签: java eclipse casting eclipse-plugin adapter


    【解决方案1】:

    您从选择中获得的许多对象并未实现 IProjectIJavaProject 之类的东西,而是一些更适合代码想要呈现视图或编辑器的方式的内部类。

    在这种情况下,您不能使用强制转换,因为选择对象没有实现您想要的接口。

    用户界面对象可以实现IAdaptable,它允许您使用object.getAdapter(...)检索底层类。

    但是,并非所有对象都自己实现IAdaptable,而是使用IAdapterManagerregisterAdapters 方法来声明一个完全不同的类,该类从UI 对象转换为底层对象。在这种情况下,您使用

    IProject project = (IProject)Platform.getAdapterManager().getAdapter(object, IProject.class);
    

    您可以使用如下的实用方法来处理所有可能性:

    public static <AdapterType> AdapterType adapt(Object adaptableObject, Class<AdapterType> adapterType)
    {
      if (adaptableObject == null)
        return null;
    
      // Is the object the desired type?
    
      if (adapterType.isInstance(adaptableObject))
        return adapterType.cast(adaptableObject);
    
      // Does object adapt to the type?
    
      if (adaptableObject instanceof IAdaptable)
       {
         AdapterType result = adapterType.cast(((IAdaptable)adaptableObject).getAdapter(adapterType));
         if (result != null)
           return result;
       }
    
      // Try the platform adapter manager
    
      return adapterType.cast(Platform.getAdapterManager().getAdapter(adaptableObject, adapterType));
    }
    

    【讨论】:

    • 感谢您的快速回复。不幸的是,我已经尝试过 Platform-Adapter。我还尝试直接从工作区(根)获取 IProjects,无需任何 UI 选择。但是由于某种原因,对 UI 选择的内容进行简单的转换效果最好……我将尝试找出信息丢失的位置;但是在调试的同时分析这么深的变量需要这么多时间
    • 如果你有一个IWorkspaceRoot 你打电话给IWorkspaceRoot.getProjects() 但这与适配器无关。 IWorkspaceRootIJavaProject 一无所知,这只是 JDT 的概念。
    • 但是您可以肯定地检查 iproject 的 isNatureEnabled 并使用 JavaCore.create(project) 使其成为 JDT-IJavaProject 如果是的话;但正如我所说,由于某种原因,这种方法对我也不起作用......我认为 CompilationUnit-visitor 在这里有问题,而不是适配器......
    • 是的,我相信这应该可行,我在 Eclipse + JDT 中看到了 269 次使用。这与适配器没有太大关系。
    • 你是对的;我发现了错误;在某个时候创建​​了重复的扫描实例。适配器工作正常。现在我不必再花 3 个小时在错误的地方寻找;再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2012-09-04
    • 2011-02-22
    • 2015-09-07
    • 2010-09-14
    • 2022-08-03
    • 2016-05-20
    相关资源
    最近更新 更多