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泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.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定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip...
3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3....
- **引入时间**:Java 5(JDK 1.5)中引入了泛型的概念。 - **背景**:在引入泛型之前,Java使用原始类型来处理集合等数据结构。这种方式会导致类型安全问题,例如在运行时可能出现`ClassCastException`异常。 **...
Java 泛型详解 Java 中的泛型是 Java 5(JDK 1.5)中引入的一项新特性,旨在解决类型安全和代码重用的问题。泛型允许程序员对类型进行抽象,使得代码更加灵活和可维护。 泛型的优点: 1. 类型安全:泛型可以在...
Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...
- **类型擦除**:Java泛型在编译后会被擦除,但在编译时提供了类型检查。 Maurice Naftalin和Philip Wadler的书籍会详细探讨这些概念,并通过实例解释如何在实际项目中应用泛型和集合。书中的文字版内容可能涵盖: ...
3. **异常处理**:学习如何捕获和处理程序运行时可能出现的错误,使用try-catch-finally语句。 4. **内存管理**:理解Java的垃圾回收机制,以及如何有效地管理内存。 5. **集合框架**:熟悉ArrayList、LinkedList...
编程选择题40道:泛型:类型安全与泛型编程.Tex.docx
2011年发布的JDK 1.7,继续扩展了Java的功能,并引入了一些关键改进: 1. **钻石操作符**:简化了无参构造器的泛型实例化。 2. **多 catch 语句**:一个catch块可以捕获多种类型的异常,减少了代码重复。 3. **...
6. 类型擦除:Java 泛型的实现基于类型擦除,这意味着在运行时,所有的泛型信息都会被擦除。因此,泛型的主要作用在于编译期,而不是运行时。 7. 编译器警告与强制转换:如果不正确地使用泛型,编译器会发出警告。...
泛型是Java语言中的一种机制,它允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致ClassCastException。 泛型的...
学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...
1. 类型擦除:Java泛型在编译后会进行类型擦除,也就是说,所有的泛型类型信息都会被替换为它们的原始类型(如`List<String>`变为`List`)。因此,泛型不支持运行时的类型检查。 2. 边界:在声明类型参数时,可以...
"Java 泛型学习" Java 泛型是 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的...
1. **类型擦除**:Java泛型的本质是在编译器层面实现的,这意味着编译后的字节码并不包含泛型中的类型信息。这一过程称为“类型擦除”。类型擦除导致了一些副作用,比如泛型类无法拥有独特的`Class`对象,所有泛型...
泛型是Java编程语言中的一个重要特性,自JDK 5版本起被引入,旨在提高代码的类型安全性,减少类型转换的麻烦,并增强代码的可读性和重用性。泛型的本质是参数化类型,允许我们在定义类、接口或方法时使用类型参数,...
3. 泛型的引入:Java SE 5.0正式引入泛型,允许在类、接口和方法中声明参数化类型,使得编译器能够在编译时期检测类型错误,提高了代码质量。 4. 普及与优化:随着Java泛型的广泛应用,JDK 6和7对其进行了进一步...
7. **泛型**:介绍了Java 5引入的泛型特性,如何使用泛型来增强类型安全性和代码重用性。 8. **注解(Annotation)**:讲解了如何定义和使用注解,以及它们在编译器指令、元数据和运行时处理等方面的应用。 9. **...