`
alexcheng
  • 浏览: 177974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java范型 (Java Generics)

阅读更多
在Java集合类中看到的List<e>这样的声明方式,<e>称为类型参数列表。当你使用这样的类的时候,需要提供相应的绑定类型。在类型声明中每次出现的类型参数符号,被称为裸类型变量。比如,get方法返回的是V,而不是Object。

Java通过擦除参数类型信息来创建一个等价的类型。每个类型参数都关联一个上界,默认是java.lang.Object。客户代码的绑定信息被擦除,并被替换成相应的类型转换。
声明:
</e></e>
java 代码
  1. import java.util.*;
  2. public class MultiHashMap
  3. private Mapnew HashMap
  4. public int size() {
  5. return map.size();
  6. }
  7. public void put(K key, V value) {
  8. List<v> values = map.get(key); </v>
  9. if (values == null) {
  10. values = new ArrayList<v>(); </v>
  11. map.put(key, values);
  12. }
  13. values.add(value);
  14. }
  15. public List<v> get(K key) { </v>
  16. return map.get(key);
  17. }
  18. }
擦除之后:
java 代码
  1. import java.util.*;
  2. public class MultiHashMap {
  3. private Map map = new HashMap();
  4. public int size() {
  5. return map.size();
  6. }
  7. public void put(Object key, Object value) {
  8. List values = (List)map.get(key);
  9. if (values == null) {
  10. values = new ArrayList();
  11. map.put(key, values);
  12. }
  13. values.add(value);
  14. }
  15. public List get(Object key) {
  16. return (List)map.get(key);
  17. }
  18. }



所有类型参数的默认上界是Object。可以限制为另外一个上界。使用extends就可以了。

当你不关心参数绑定的具体类型的时候,可以使用通配符?。不能把一个List<string>的引用赋给一个List的引用。通配符可以与extends结合起来使用。

当一个方法的参数与它的另一个参数或是返回值的类型之间存在依赖的时候,应该使用范型方法;否则,应该使用通配符。

上界的通配符,在读取一个数据结构的时候是有用的;当写入一个数据结构的时候,可以使用下界通配符。
使用super可以指定下界。

可以在extends中指定附加的边界或是多个类型。第一个约束可以是接口或是类,接下来的约束必须是接口。通过附加边界,你可以限制参数实现多个接口。
java 代码
  1. public static
  2. <t>extends Iterable&Comparable<t>> </t>void iterateAndCompare(T t) </t>


可以通过checked wrapper来解决遗留代码的类型安全问题。

不能创建已经绑定的参数类型的数组。

不能使用裸类型变量来创建新的对象。不能把裸类型变量作为instanceof操作符的目标。

通过反射不能知道类型变量的绑定信息,因为擦除机制的存在。</string>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics