何时使用IAdaptable?

时间:2014-07-30 08:38:53

标签: java eclipse eclipse-plugin

给定一个类型A的对象,并希望在可能的情况下将其转换为类型B,何时适合使用以下各项?

  1. 直接演员和/或instanceof支票

    if(a instanceof B) {
        B b = (B)a;
        // ...
    }
    
  2. 通过IAdaptable.getAdapter转换

    // assuming A implements/extends IAdaptable
    B b = (B)a.getAdapter(B.class);
    if(b != null) {
        // ...
    }
    
  3. IAdaptable无法隐式转换为“IAdaptable”时,通过A进行转换

    B b = (a instanceof IAdaptable ? (B)((IAdaptable)a).getAdapter(B.class) : a instanceof B ? (B)a : null);
    if(b != null) {
        // ...
    }
    
  4. 通过IAdapterManager进行转换

    B b = (B)Platform.getAdapterManager().getAdapter(a, B.class);
    if(b != null) {
        // ...
    }
    

1 个答案:

答案 0 :(得分:3)

这很难给出一般规则。

当您从Eclipse项目视图中获得类似当前选择的内容时,该对象是用户界面而不是底层对象(例如项目或文件)。 instanceof无效。

从用户界面对象到底层对象的转换通常使用IAdapterFactory来完成,Platform.getAdapterManager().getAdapter指定进行转换的单独工厂类。在这种情况下,您必须使用IAdaptable

当一个对象实现public final class AdapterUtil { /** * Get adapter for an object. * This version checks first if the object is already the correct type. * Next it checks the object is adaptable (not done by the Platform adapter manager). * Finally the Platform adapter manager is called. * * @param adaptableObject Object to examine * @param adapterType Adapter type class * @return The adapted object or <code>null</code> */ public static <AdapterType> AdapterType adapt(Object adaptableObject, Class<AdapterType> adapterType) { // 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)); } } 时,你必须查看文档或源代码,看看它支持哪些类适应。

我认为情况3不会发生。

我经常使用这个代码来处理大多数事情:

{{1}}