`
alexcheng
  • 浏览: 181694 次
  • 性别: 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>
分享到:
评论

相关推荐

    Java 范型攻略篇

    ### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,范型(Generics)的引入标志着语言设计上的一个重要里程碑。自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极...

    java 泛型类的类型识别示例

    在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

    java范型学习

    stringList.add("with generics"); String s1 = stringList.get(0); ``` 在上述代码中,`String`就是类型参数`E`的具体类型,`E`是类型变量,代表一个待定的类型。当我们实例化`List&lt;String&gt;`时,`E`就被替换为`...

    Java 泛型(Generics)使用说明

    本例子说明演示了Java范型使用的动机、范型类的使用、范型方法的使用,以及范型的缺陷:类型擦除(type erasure).因为,现在Java的反射机制不能确定集合中的对象类型! 在实际应用中,如果能够灵活应用范型和反射...

    Java程序设计范型和枚举PPT教案学习.pptx

    首先,我们来看什么是范型(Generics)。范型是Java SE 5.0引入的一个特性,它允许在类、接口和方法中使用类型参数,从而实现泛化的数据容器。在Java中,范型也被称为参数化类型。例如,`HashMap, Value&gt;`就是一个...

    Java经典题目_新手笔试使用

    范型(generics)是Java 5引入的特性,用于提供类型安全的泛型容器。 3. **常用包**:Java中常见的包有`java.lang`(包含基本类型和对象的基类)、`java.util`(提供集合框架、日期时间API等)、`java.io`(输入...

    java新特性简介.ppt

    6. **范型(Generics)**: 范型是Java中的一种类型参数化机制,允许在类、接口和方法中使用类型参数。它们增强了类型安全,确保在编译时期就能捕获潜在的类型错误。范型通过泛型类型参数 `&lt;T&gt;`来表示,如`List&lt;T&gt;`...

    jdk1.5中的范型

    自 JDK 1.5 开始,Java 语言正式引入了一项重要的特性——泛型(Generics),这使得 Java 成为了一个更为强大且灵活的语言。泛型允许开发人员编写出类型安全的通用类或方法,从而提高了代码的复用性和可维护性。本文...

    第9章 范型和容器类.ppt

    在Java编程语言中,范型(Generics)和容器类是重要的核心概念,它们极大地提高了代码的可读性、安全性和复用性。本章主要探讨了如何利用这些概念来处理动态数据集合。 首先,传统的数组在Java中存在一些限制,如数...

    JAVA经典题目.pdf

    - **范型(Generics)**:提供了一种类型安全的方式来创建高度可重用的组件。 ### 3. 常用的包 Java 中有一些广泛使用的包,例如: - **`java.lang`**:包含了基本的类和接口,如 `String`、`Integer` 和 `System...

    实验六,集合与范型.zip

    其次,范型(Generics)是Java 5引入的新特性,它的目的是为了增强类型安全性,并消除运行时的类型检查。范型允许我们在创建集合时指定其元素类型,从而避免了类型转换错误和潜在的ClassCastException。 1. 泛型类...

    Hibernate_范型_级联

    范型(Generics)是Java 5引入的一个特性,用于提高代码类型安全性和可读性。而级联(Cascading)则是Hibernate中处理关联对象的一种策略,它定义了当一个实体被保存、更新或删除时,与之关联的其他实体应该如何处理...

    java学习资料(面试题 笔试题)

    此外,Java还引入了范型(Generics)以增强类型安全。 3. **常用包**:Java中最常见的包包括`java.lang`(基础包,包含所有Java程序的基本类)、`java.util`(提供各种实用工具类)、`java.io`(处理输入输出)、`...

    JDK1.5新特性

    ### 范型(Generics) 范型是Java 1.5引入的一个重要特性,它增强了类型安全并减少了代码冗余。范型允许我们在类、接口和方法中指定类型参数,从而可以创建泛型类和泛型方法。例如,我们可以创建一个泛型列表,限制...

    jdk5.0新特性实例讲解

    同时,JDK 5.0的文档和实例代码,如"java枚举学习.doc"和"java范型学习.doc",将提供宝贵的实践指导,帮助你更好地掌握这些内容。而"jdk5.0新特征.txt"则可能包含了对所有新特性的详细描述和使用示例,是深入学习的...

    范型和仿函数在桌面系统中的应用

    虽然标签部分没有提供额外信息,但结合部分内容,我们可以深入探讨范型(Generics)和仿函数(Functors)在桌面系统开发中的作用及其带来的好处。 ### 泛型:提升类型描述深度与类型安全性 泛型是现代编程语言如...

Global site tag (gtag.js) - Google Analytics