快速业务通道

IAdaptable是什么? - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

IAdaptable是什么?

时间:2011-04-30 八进制译

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);

IAdaptable是什么?(2)

时间:2011-04-30 八进制译

实现IAdaptable接口

大部分IAdaptable的实现是一些if语句的叠加,比如我们现在要实现HashMap的 getAdapter()方法,它看起来可能是这样:

public class HashMap implements IAdaptable {   public Object getAdapter(Class clazz) {    if (clazz == java.util.List.class) {     List list = new ArrayList(this.size());     list.addAll(this.values());     return list;    }    return null;   }   //  }

所做的就是返回一个适配器(adapter,更确切的说是一个副本),而不是进行直接的类 型转换。如果参数类型没有被支持,惯例是返回null值(而非抛出异常),代表这个方法失 败了。因此,在调用这个方法时,不应该假定它总是返回非null值。

PlatformObject

当然,如果你希望增加一个新的被支持的adapter类型时必须编辑这个类才行(译注:在 getAdapter()里增加更多的if语句),这会比较辛苦。而且,既然你已经

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号