泛型:参数化类型
基本概念
定义:
定义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