定义
Java的类属机制,即类型参数化
语法
类型参数化
class GenericClass<T> { }
interface GenericInterface<T> { }
<T> T genericFunction(T args…) { }
类型实例化
SubGenericClass extends GenericClass<String>
new GenericClass<String>
genericFunction(new String(“Hello World”))
目的
为模板代码在编译器级别避免产生ClassCastException
如果没有泛型,那么在定义模板代码时只能将类型不确定的引用声明为可能类型的公共基类,离开模板代码后必须手动向下转型,存在潜在的产生ClassCastException可能性
泛型要求在进入泛型代码前指定一个实例类型以替换类型参数,由编译器在离开后自动向下转型为实例类型,从而防止手动向下转型可能出现的错误,避免产生ClassCastException
原理
Java泛型的实现原理是擦除
擦除是指在泛型代码内部,用类型参数声明的引用均视为Object类型,因此只能调用Object的方法,所有实例类型的相关信息都将消失
Java采取擦除的策略是为了兼容Java1.5以前的应用
泛型的作用只体现在进入泛型代码时编译器检查对象是否为实例类型或其后代类,在离开泛型代码时编译器自动将对象向下转型为实例类型,并不代表泛型可以在泛型代码内部得到实例类型的信息
由于擦除的存在,Generic<T>和Generic<S>是相同的
限制
(“外露”类型参数 ― 单独出现而不是位于某个类型中的类型参数)
1. 不应在静态成员中引用封闭类型参数
静态成员属于这个类所有对象共有,而泛型类的不同对象的实例参数可能不同
2. 不能用基本类型实例化泛型类型参数
基本类型(int等)不是Object的子类,应用包装类(Integer等)代替
3. 不能在数据类型转换或 instanceof 操作中使用“外露”类型参数
instanceof是静态操作,而在泛型代码内部没有任何关于实例类型的信息,应用isInstance()代替
4. 不能在 new 操作中使用“外露”类型参数
不能确定实例类型的构造器有哪些
5. 不能在类定义的 implements 或 extends 子句中使用“外露”类型参数
防止子类(或实现) 的对象的实例类型与基类(或接口)的应用的实例类型不一致导致的向上转型出错
受限泛型
只能在定义时使用
用extends指定了上界的泛型,用于限定合法实例类型的范围,如果没有指定,默认为Object
<T extends SomeClass> 实例类型必须是SomeClass的子类
<T extends Generic<T>> 实例类型必须是Generic的子类,并且Generic的类型参数也被实体化为这个类型
Generic <T extends Generic<T>> 实例类型必须是正在定义的这个类的子类
无论是在一般泛型代码还是受限泛型代码中用类型参数声明的引用均视为Object类型,但在一般泛型代码中,任何类型均可实例化类型参数,因此对引用任何的向下类型转换都是不安全的;而是在受限泛型代码中,只有上界或其后代类型可以实例化类型参数,对引用可以安全的向下转型为上界类型或其祖先类型
通配符
只能在声明时使用
用于扩大实例化的泛型引用所能引用的泛型对象
class Generic <T> {
T t;
set(T t) {this.t = t;}
T get() {return this.t;}
}
class Food {}
class Fruit extends Food{}
class Apple extends Fruit {}
class Orange extends Fruit {}
Generic<Fruit> fruit;
Generic<Apple> apple = new Generic<Apple>();
Generic<Orange> orange = new Generic<Orange>();
在Java泛型中,引用fruit不能引用apple、orange,只能使用通配符来完成这个功能
上界
用extends指定上界,使引用可以引用用上界类型或其后代类型实例化的对象,进入方法不能调用,开方法返回上界类型
Generic<? extends Fruit> fruit1;
此时,fruit1可以引用apple、orange,
fruit1.set()
不能调用,假设可以调用,下面代码将会破坏泛型机制
fruit1 = apple;
fruit1.set(new Orange);
Apple otherApple = apple.get();
此时fruit1和apple引用同一对象,Apple otherApple = apple.get()将一个Orange的对象向下转型为Apple,产生ClassCastException
fruit1.get()
返回Fruit类型的对象
下界
用super指定上界,使引用可以引用用下界类型或其先祖类型实例化的对象,进入方法参数类似是下界类型或其后代类型,离开方法返回Object对象
Generic<? super Fruit> fruit2;
fruit2 = new Generic<Food>();
fruit2.set()
参数类型可以是Fruit或其后代类型
fruit2.get()
返回Object对象
分享到:
相关推荐
"JAVA泛型笔记.pdf" Java 泛型(Generic)是 Java 5 中引入的一种机制,它允许开发者在编写类、接口和方法时指定类型参数,以提高代码的灵活性和可重用性。泛型的主要特点是可以在编译期检查类型的正确性,避免了...
java泛型详细学习,深入学习java的不二之选
在Java泛型出现之前,集合框架中的类如`List`、`Map`等都是以`Object`作为类型处理元素的。这意味着在使用这些集合时,往往需要频繁地进行类型转换操作,如: ```java List list = new ArrayList(); list.add("hello...
Java泛型与容器详细笔记涉及到Java编程语言中的两个重要概念:泛型(Generics)和容器(Containers)。容器主要包括Java集合框架中的各类集合类,如List、Set、Map等,它们用于存储和操作数据。泛型则提供了一种类型...
Java泛型是Java语言提供的一种编程特性,旨在支持在编译时期进行类型检查和类型消除,使得编写的代码在不放弃类型安全的前提下,具有更好的通用性和复用性。学习Java泛型能够帮助我们更好地编写和使用通用的类、接口...
日常笔记-JAVA泛型
自己总结的java泛型的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
本资源为 Java 1.5 泛型指南中文版的详细笔记,涵盖了泛型的基础知识、泛型类、泛型方法、通配符、擦除和翻译、类型安全、类型参数、实际类型参数、擦除、翻译、转型和 instanceof、数组、Class Literals as Run-...
在面向对象高级特性的部分,笔记可能包含抽象类、接口、内部类、匿名类、枚举,以及泛型和注解的使用。这些特性使得Java代码更加灵活且易于维护。 最后,笔记可能还会涉及一些设计模式,如单例模式、工厂模式、观察...
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部...2020-4-15 java 泛型 2020-4-18 java IO流 2020-4-19 java 网络编程 2020-4-21 java反射 2020-4-22 java8 新特性 2020-4-27 单元测试
"Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...
10. **泛型**:讨论Java泛型的使用,如何编写类型安全的代码,并理解其类型擦除的原理。 11. **枚举与注解**:介绍Java中的枚举类型及其用法,以及注解的定义和应用,它们在现代Java开发中有着广泛的应用。 12. **...
【Java编程语言基础】 Java是一种广泛使用的面向对象的编程...这些笔记内容全面覆盖了Java的基础和进阶知识,适合从零开始学习Java的人群,通过系统学习,可以建立起扎实的Java编程基础,为实战项目开发打下坚实基础。
泛型是Java编程语言中的一个重要特性,首次在JDK 1.5版本中引入,它允许程序员在定义类、接口和方法时使用类型参数,从而实现了类型的安全性和代码的复用性。泛型的主要目标是增强类型安全,避免在运行时出现...
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
此外,《JAVA学习笔记》还涵盖了集合框架,包括ArrayList、LinkedList、HashSet、HashMap等各种集合类的使用,以及泛型、迭代器和流API的应用。这些内容对于处理数据和实现复杂算法至关重要。 对于多线程编程,书中...
详细的介绍了集合框架的用法,及其语法规则,剖析了使用的使用注意事项,帮助更牢靠的掌握集合框架的知识及泛型内容。谢谢