`
matchless1688
  • 浏览: 26654 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

每日学习:2011.3.4 Java泛型

阅读更多
1、在泛型代码内部,无法获取任何有关泛型参数类型的信息,Java泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了。
  所以需要为泛型指定边界(extends)=》泛型类型参数将擦除到它的第一个边界,当具有多重边界时,扩展基类只能有一个,而且必须放在第一位,接口可以有多个,用&来连接。

2、擦除的核心动机是它使得泛化的客户端可以用非泛化的类库来使用(迁移兼容性),泛型的目标是将类型安全检查移入编译期,避免运行时类型转化带来的不安全

3、擦除的补偿:引入类型标签,使用动态的isInstance()来判断类型,通过Class<T>.newInstance()来恢复

4、创建泛型数组的唯一方式是创建一个被擦除类型的新数组,然后对其转型=>(T[])new Object[size]
   因为有了擦除,数组的运行时类型就只能是Object[]
   数组对象在底层有详细实现,保证可以保留有关它们包含的对象类型的规则,而泛型不可以(数组支持协变)

5、关于容器的泛型:在这里其实我们讨论的是容器的类型,而不是容器持有的类型。与数组不同,泛型没有内建的协变类型,因为数组在语言中是完全定义的,因此可以内建编译期和运行时的检查。但在用泛型时编译器和运行时系统都不知道你想用类型做些什么,以及应该采用什么样的规则。

6、通配符(?):
List<? extends Fruit> fList = new ArrayList<Apple>();
//compile error:can't add any type of object
//fList.add(new Apple());
//fList.add(new Fruit());
//fList.add(new Object());
Fruit f = fList.get(0); //ok

上述代码解释: (? extends Fruit) 告诉编译器类型为一切扩展自Fruit的类型,知道这一边界后,Fruit返回类型的get是ok的,但List的add()的参数也是(? extends Fruit),这意味着可以是任何事物,而编译器无法验证"任何事物"的类型安全性。

List<? extends Fruit> 你可以将其读作“具有任何从Fruit继承的类型的列表”,但是实际上并不意味着这个List将持有任何类型的Fruit。通配符引用的是具体类型,因此它意味着“没有指定具体类型的List”;
分享到:
评论

相关推荐

    4.java泛型的限制.zip

    4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip...

    1.java泛型定义.zip

    1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....

    2.java定义泛型类.zip

    2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip...

    3.java实例化泛型类.zip

    3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3....

    Java泛型编程指南.pdf

    - **引入时间**:Java 5(JDK 1.5)中引入了泛型的概念。 - **背景**:在引入泛型之前,Java使用原始类型来处理集合等数据结构。这种方式会导致类型安全问题,例如在运行时可能出现`ClassCastException`异常。 **...

    Generics_in_the_Java_Programming_Language译文

    Java 泛型详解 Java 中的泛型是 Java 5(JDK 1.5)中引入的一项新特性,旨在解决类型安全和代码重用的问题。泛型允许程序员对类型进行抽象,使得代码更加灵活和可维护。 泛型的优点: 1. 类型安全:泛型可以在...

    Java泛型的用法及T.class的获取过程解析

    Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...

    [Java泛型和集合].(Java.Generics.and.Collections).文字版

    - **类型擦除**:Java泛型在编译后会被擦除,但在编译时提供了类型检查。 Maurice Naftalin和Philip Wadler的书籍会详细探讨这些概念,并通过实例解释如何在实际项目中应用泛型和集合。书中的文字版内容可能涵盖: ...

    java认证课程..netscreen公司出的中文参考资料.rar_JAVA认证_site:www.pudn.com_认证

    3. **异常处理**:学习如何捕获和处理程序运行时可能出现的错误,使用try-catch-finally语句。 4. **内存管理**:理解Java的垃圾回收机制,以及如何有效地管理内存。 5. **集合框架**:熟悉ArrayList、LinkedList...

    编程选择题40道:泛型:类型安全与泛型编程.Tex.docx

    编程选择题40道:泛型:类型安全与泛型编程.Tex.docx

    jdk 1.5:1.6:1.7.zip

    2011年发布的JDK 1.7,继续扩展了Java的功能,并引入了一些关键改进: 1. **钻石操作符**:简化了无参构造器的泛型实例化。 2. **多 catch 语句**:一个catch块可以捕获多种类型的异常,减少了代码重复。 3. **...

    Java1_5泛型.zip

    6. 类型擦除:Java 泛型的实现基于类型擦除,这意味着在运行时,所有的泛型信息都会被擦除。因此,泛型的主要作用在于编译期,而不是运行时。 7. 编译器警告与强制转换:如果不正确地使用泛型,编译器会发出警告。...

    泛型讲解 类型通配符

    泛型是Java语言中的一种机制,它允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致ClassCastException。 泛型的...

    Java泛型学习笔记.pdf

    学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...

    Java开发实战从入门到精通视频教程下载第10章 泛型.zip

    1. 类型擦除:Java泛型在编译后会进行类型擦除,也就是说,所有的泛型类型信息都会被替换为它们的原始类型(如`List&lt;String&gt;`变为`List`)。因此,泛型不支持运行时的类型检查。 2. 边界:在声明类型参数时,可以...

    java泛型学习ppt

    "Java 泛型学习" Java 泛型是 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的...

    Java深度历险之Java泛型.docx

    1. **类型擦除**:Java泛型的本质是在编译器层面实现的,这意味着编译后的字节码并不包含泛型中的类型信息。这一过程称为“类型擦除”。类型擦除导致了一些副作用,比如泛型类无法拥有独特的`Class`对象,所有泛型...

    JAVA第八章 泛型.pptx

    泛型是Java编程语言中的一个重要特性,自JDK 5版本起被引入,旨在提高代码的类型安全性,减少类型转换的麻烦,并增强代码的可读性和重用性。泛型的本质是参数化类型,允许我们在定义类、接口或方法时使用类型参数,...

    java泛型技术之发展

    3. 泛型的引入:Java SE 5.0正式引入泛型,允许在类、接口和方法中声明参数化类型,使得编译器能够在编译时期检测类型错误,提高了代码质量。 4. 普及与优化:随着Java泛型的广泛应用,JDK 6和7对其进行了进一步...

    Prentice.Hall.Core.Java.Volume.2.Advanced.Features.8th.Edition.

    7. **泛型**:介绍了Java 5引入的泛型特性,如何使用泛型来增强类型安全性和代码重用性。 8. **注解(Annotation)**:讲解了如何定义和使用注解,以及它们在编译器指令、元数据和运行时处理等方面的应用。 9. **...

Global site tag (gtag.js) - Google Analytics