RSS
热门关键字:  java  Ajax  JSP  JSF  Struts
当前位置 : 首页>Java>列表

Java 理论和实践: 了解泛型

来源: 作者: 时间:2007-11-07 点击:


interface Collection {
public boolean remove(E e); // not really
public void removeAll(Collection c); // not really
}

但实际上却是:

interface Collection {
public boolean remove(Object o);
public void removeAll(Collection c);
}


为什么呢?答案同样是因为向后兼容性。x.remove(o) 的接口表明“如果 o 包含在 x 中,则删除它,否则什么也不做。”如果 x 是一个泛型集合,那么 o 不一定与 x 的类型参数兼容。如果 removeAll() 被泛化为只有类型兼容时才能调用(Collection),那么在泛化之前,合法的代码序列就会变得不合法,比如:

// a collection of Integers
Collection c = new HashSet();
// a collection of Objects
Collection r = new HashSet();
c.removeAll(r);

如果上述片段用直观的方法泛化(将 c 设为 Collection,r 设为 Collection),如果 removeAll() 的签名要求其参数为 Collection 而不是 no-op,那么就无法编译上面的代码。泛型类库的一个主要目标就是不打破或者改变已有代码的语义,因此,必须用比从头重新设计泛型所使用类型约束更弱的类型约束来定义 remove()、removeAll()、retainAll() 和 containsAll()。

在泛型之前设计的类可能阻碍了“显然的”泛型化方法。这种情况下就要像上例这样进行折衷,但是如果从头设计新的泛型类,理解 Java 类库中的哪些东西是向后兼容的结果很有意义,这样可以避免不适当的模仿。

共3页: 上一页 [1] [2] 3 下一页
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
Google Adsense
相关文章