IAdaptable在Eclipse里是一个非常重要的接口。对于Eclipse开发老手来说,它就像异常 处理和抽象类一样寻常;但是对新手而言,它却令人感到困惑和畏惧。这篇文章将向你解释 IAdaptable到底是什么,以及它在Eclipse里起到的作用。
类型转换
Java是所谓的强类型语言,也就是说,每个实例都对应一个类型。其实类型分为两种:声 明类型和运行时类型(也分别被称为静态类型和动态类型)。像Python这样的弱类型语言常 被称为无类型的语言,其实严格说来不是这样,因为每个实例都对应一个运行时类型,只是 你并不需要声明这一点而已。
现在回到Java,为了能够执行一个类的某个方法,这个方法必须在声明类型中可见,换句 话说,即使在运行时实例是某个子类型,你也只能执行那些父类型里定义的方法。
List list = new ArrayList();
list.add("data"); // 正确,add是List里定义的方法
list.ensureCapacity(4); // 不正确,ensureCapacity()只在ArrayList被定义
如果一定要执行特定类型的方法,我们必须先强制转换这个实例到正确的类型。对于上面 的例子,我们可以将list转换为ArrayList(译注:原文In this case, we can cast ArrayList to List,怀疑是笔误),因为ArrayList实现了List接口,你甚至可以在运行时 通过instanceof关键字检验list是否为ArrayList的一个实例。
可扩展的接口
不幸的是,一个类可能并没有实现你需要的接口,这样就无法进行强制类型转换了。原因 有很多,比如只在少数情况下才需要这个接口,或者你需要的接口是在另一个不相关的库里 ,又或者接口是有了类以后才开发出来的,等等。
这时你就需要IAdaptable了。可以把IAdaptable想象为一个能够动态进行类型转换的途径 。对比下面的直接类型转换:
Object o = new ArrayList();
List list = (List)o;
换一种方式,我们可以这样做:
IAdaptable adaptable = new ArrayList();//译注:这里的ArrayList应该不是指 java.util.ArrayList
List list = (List)adaptable.getAdapter(java.util.List.class);
这就是上面所说的动态类型转换,我们所做的事情是试图把adaptable转换为一个List实 例。
那么,当可以直接转换的时候为什么要费这个力气通过getAdapter()来转换呢?其实这种 机制可以让我们将目标类转换为它并没有实现的接口。举个例子,我们可能想把一个HashMap 当作List来用,尽管这两个类的性质并不相同,可以这么做:
IAdaptable adaptable = new HashMap();//译注:这里的HashMap应该不是指 java.util.HashMap
List list = (List)adaptable.getAdapter(java.util.List.class);