泛型:参数化类型
基本概念
定义:
定义1:把类型参数化
定义2:例如:public class Generic<T>
此时的T便是泛型,
理解:
泛型是个数据类型,可以用T定义变量
参数化:
- 将数据类型由原来的具体类型变成一个参数,(类似于方法中的变量参数,可以称为类型实参),
- 在使用/调用时,传入具体的类型,(类型实参)。
目的:
- 限制传入的参数类型,方便程序操作
- 避免
java.lang.ClassCastException
异常
(因为如果不限制传入的数据类型,可能传入任意数据,而数据使用时需要强制转化成目的类型,如果类型不匹配,强制转化可能报错。)
作用位置:
类,接口,方法
特点:
- 如果未指定泛型类型,则默认为java.lang.Object。
- Java中的集合框架所涉及的接口和类,大都是泛型接口和泛型类。
- 利用泛型类、泛型接口的实现类创建对象,可以不指定泛型类型。
- 泛型只在编译阶段有效,不会进入运行阶段(编译过程中检测泛型结果后,抹去相关信息,再运行)
泛型类:
- 泛型类型参数只能是类类型,不能是简单类型
-
- Generic
genericInteger =new Generic (123); 对
- Generic
-
- Generic
genericInteger =new Generic (123); 错
- Generic
- 不能 对确切的泛型类型使用instanceof操作
-
- 错误:if(genericInteger instanceof Generic
)
- 错误:if(genericInteger instanceof Generic
-
- 正确:if(genericInteger instanceof Generic)
- 泛型类不会自动封装,不会自动转化数据类型
基本操作
测试代码:
public class Generic<T> { T key; public Generic(T key) { super(); this.key = key; } public T getKey() { return key; } public void setKey(T key) { this.key = key; } public static void main(String[] args) { Generic<String> genericString =new Generic<String>("abc"); Generic<Integer> genericInteger =new Generic<Integer>(123); System.out.println(genericInteger.getKey()); System.out.println(genericString.getKey()); Generic genericObject =new Generic("Object"); System.out.println(genericObject.getKey()); Generic g1 =new Generic(123); Generic g2 =new Generic(12.3); Generic g3 =new Generic('1'); System.out.println(g1.getClass());//获取该对象的数据类型 System.out.println(g2.getClass()); System.out.println(g3.getClass()); /* * 结果:class Sdut.Generic class Sdut.Generic class Sdut.Generic 结论:泛型只在编程阶段有效 因此:不能 对确切的泛型类型使用instanceof操作 例如:if(genericInteger instanceof Generic<Integer>) 错误 正确:if(genericInteger instanceof Generic) * */ System.out.println(g3.getClass()==g2.getClass()); //结果:true,说明数据类型相同 } }
泛型的上下边界
在使用泛型的时候,可以为传入的泛型类型实参进行上下边界的限制。
例如:实参只准传入某类型父类或子类。
例如:
public class Generic<T extends Number> {//定义了上边界Number类(数值类) //则传入String类型的数据报错 }
附:Number类的子类
- AtomicInteger, AtomicLong, BigDecimal, BigInteger,
- Byte, Double, Float, Integer, Long, Short
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/15552438.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步