Eclipse中的IAdaptable解析[Java编程]
本文“Eclipse中的IAdaptable解析[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Java是一种强范例语言,每个实例都必须有指定的范例.实际上,Java范例有两种声明范例和 运行时范例 (也可以呼应的说是静态范例 和动态范例 ). 像Python这样的弱范例语言普通称为无范例,但是这样说并不严谨,因为每个实例都有它的运行时范例.你只是不用事前声明一个实例的范例罢了.
要想调用一个对象中的办法,这个办法需求在声明范例中存在.也就是说,你只能调用定义在父类中的办法,即便该实例是一个肯定的子范例:
List list = new ArrayList();
list.add("data"); // 在这里没问题
list.ensureCapacity(4); // 这里就不行了ensureCapacity() 只在ArrayList中才有.
假如我们要调用实际范例中的办法,我们首先要将它转为精确的范例.在本例中,我们可以把 ArrayList 转为List,因为ArrayList实现了List 接口. 也可以在运行时动态的查验,利用 list instanceof ArrayList.
可扩大的接口
糟糕的是,一个类不能老是实现你所需求实现的接口.大概是因为这只对少数几种情形才有效,大概它是一个没有被关联的库中的范例,大概这个接口在后期又被改变了.
这种情形便可以利用IAdaptable. 你可以把 IAdaptable 动态的举行范例转化.利用以下办法避免直接的范例转化:
Object o = new ArrayList();
List list = (List)o;
我们可以这样做:
IAdaptable adaptable = new ArrayList();
List list = (List)adaptable.getAdapter(java.util.List.class);
你可认为它是一种范例动态转化; 我们把adaptable转为List实例.
为什么不直接转化,而要用额外的getAdapter() 呢?这种机制可以使我们将目标类转化为没有实现的接口.比方, 我们大概想利用HashMap 作为一个 List, 固然他们并不兼容.
IAdaptable adaptable = new HashMap();
List list = (List)adaptable.getAdapter(java.util.List.class);
实现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;
}
// ...
}
返回的是一个对自身的代理,而不是直接转化范例.假如恳求的是不支持的范例,可以直接返回null表明失利,这样比抛出非常要好.
以上是“Eclipse中的IAdaptable解析[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |