IAdaptable是什么?

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

时间: 2024-12-03 21:39:42

IAdaptable是什么?的相关文章

Eclipse中的IAdaptable分析

Java是一种强类型语言,每个实例都必须有指定的类型.实际上,Java类型有两种声明类型和 运行时类型 (也可以相应的说是静态类型 和动态类型 ). 像Python这样的弱类型语言通常称为无类型,但是这样说并不严谨,因为每个实例都有它的运行时类型.你只是不用事先声明一个实例的类型而已. 要想调用一个对象中的方法,这个方法需要在声明类型中存在.也就是说,你只能调用定义在父类中的方法,即使该实例是一个确定的子类型: List list = new ArrayList();list.add("data

平台化三部曲之一微核心可扩展架构 - 从Eclipse平台看交易平台化

该文章来自阿里巴巴技术协会(ATA)精选集 从Eclipse平台看交易平台化 淘宝网的交易平台伴随着互联网,网络购物的蓬勃发展,支持淘宝网成为全球最大的在线交易平台.各种业务方和他们新的交易类型对交易平台提出各种各样的需求,让交易系统的响应和业务支持在现有系统基础上越来越显露出其系统架构上的缺陷,架构缺乏平台化定制扩展的功能,在快速支持新业务,扩展业务功能方面越发捉襟见肘,只能通过加大开发团队力量的投入来满足业务方的需求. 最近交易开始"平台化",希望通过的业务模型,业务流程的重构,能

基础业务集成开发平台(BusinessWorks) - 业务开发篇

BusinessWorks目前以二方包的形式提供给已有业务系统用来满足平台化建设,适应业务快速开发需要.在这边ATA中,我们会介绍我们代码的组织结构和基本实现, 然后会针对交易领域简化开发一个订单下单的例子,来阐述如何进行业务的模块化开发,实现业务隔离. 1. 代码结构 businessworks-platform 是业务基础集成的平台实现 platform-common 提供平台的一些底层基础类库实现,包括对guice的扩展实现 platform-core 提供平台的一些核心功能实现,比如配置

利用视图链接使Eclipse应用程序更丰富

程序|链接|视图 丰富的 GUI 中的视图可以以各种方式显示信息,从而改善用户体验.非常自然,UI 视图之间是相互依赖的,需要进行交互.Eclipse 简化了链接 UI 视图的工作,并提供了将视图链接应用到非 UI 场景的方式. 简介 Eclipse 平台允许使用可插入组件 -- 插件 -- 帮助创建丰富的图形用户界面(graphical user interface,GUI)应用程序.例如,插件可以向 GUI 提供视图.但是,在现实的应用程序中,UI 视图不能是孤立的.它们需要根据其他视图的状

【Eclipse插件开发】基于WTP开发自定义的JSP编辑器(四)

Strucutured Document分析视图 在上一篇中,我们详细阐述了WTP中最重要的数据模型之一IStructuredDocument(我们就称之为WTP Document吧,和另外一个核心数据模型WTP Model----IStructuredModel对应),本节中我们将自己开发 一个工具来分析IStrucutredDocument. PS:千万别着急,后面的文章会对WTP StructuredTextEditor进行功能特征定制的,在真正定制之前 一定要搞清楚WTP Documen

EMF介绍系列(七、.Edit初步)

EMF除了生成模型部分的接口和实现类(不妨称作"核心模型")以外,还生成一个名称 以.Edit结尾的项目,包含一些与核心模型和编辑器关系都十分紧密的代码.这部分代码经过 了精心设计,可重用的程度是相当的高.它们不仅在EMF生成的编辑器项目里大量被用到,我 们自己在扩展编辑器的时候也应该充分利用. 在线商店的例子里,com.my.shop.edit项目里包含一个ItemProviderAdapterFactory类和 一组 ItemProviderAdapter的子类,后者是和核心模型的

eclipse插件开发 popupMenu 怎么才能右键点击JAVA文件时候才展示插件

问题描述 eclipse插件开发 popupMenu 怎么才能右键点击JAVA文件时候才展示插件 eclipse插件开发 popupMenu 只有右键点击JAVA文件时候才展示插件 ,右键点工程部显示我在网上找了一下,都不行 plugin.xml 文件如下 <?xml version=""1.0"" encoding=""UTF-8""?><?eclipse version=""3.3&q

基础业务集成开发平台(BusinessWorks) - 概要设计篇

Businesworks的设计目标是为复杂业务系统提供平台化的底层支持,所谓平台化,就是对业务开发能以扩展,隔离的方式推进,驱动业务快速支持. 目前阿里很多的业务系统随着业务支持的增加,慢慢发展成为一个庞大的铁板一块式monolithic(铁板一块式) 风格的强耦合系统,系统本身可能经历一些重构和优化,满足新业务发展.但整体上还是为了快速的满足业务需求,在主流程上打补丁的方式,对业务的响应能力越来越差.于是平台化被提上日程,希望重新审视系统的架构设计,使架构不成为业务快速发展的瓶颈,并且进一步促