什么是泛型
类似于一种标签,标签标志着放的东西
举例,你想加一个 姓名 年龄,那么你只想装 str 和 intger 类型 。但是 集合一般都什么都能装
所以需要泛型规定一下
泛型不能为基本数据类型,一般取包装类
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
floar | Float |
double | Double |
boolean | Boolean |
包装类的特点:
(1)所有包装类都是final类型,因此不能创建他们的子类。
(2)包装类是不可变类,一个包装类的对象自创建后,他所包含的基本类型数据就不能被改变。
装箱:将基本数据类型变为包装类对象。
拆箱:将包装类中包装的基本数据类型取出。
int到Integer Integer到int
使用Integer类的构造方法 调用Integer类的intValue()方法
使用Integer类内部的valueOf( )方法 自动拆箱
自动装箱
2.int到nteger类:
三种方法:
(1)使用Integer类的构造方法
(2)使用Integer类内部的valueOf( )方法
(3)自动装箱
(1)方法1:使用Integer类的构造方法
public Integer(int value):将int类型转换为Integer类。
public Integer(String s):将String类型转换为Integer类。
注意:使用此构造方法时,字符串内的字符必须由数字组成,不可以是字母或者其他形式,否则抛出NumberFormatException。
public static void main(String[] args)
{
//方式1:public Integer(int value)
int i= 100;
//将int类型的i转换为Integer类型的ii
Integer ii = new Integer(i);
System.out.println(“ii:”+ii);
//方式2:public Integer(String s)
String s = "100";
//String s = "abc";出错,因为这个字符串必须由数字字符组成。
Integer iii = new Integer(s);
System.out.println("iii:"+iii);//100
}
(2)方法2:使用Integer类内部的valueOf方法
public static Integer valueOf(int i):将int类型转换为Integer类。
Integer i3 = Integer.valueOf(30);
1
(3)方法3:自动装箱的方法:
事实上,编译器自动执行了valueOf方法。
Integer ii = 100;//编译器自动执行了Integer ii = Integer.valueOf(100)
1
包装类 装箱 拆箱
Byte valueOf() byteValue()
Short valueOf() shortValue()
Integer valueOf() intValue()
Long valueOf() longValue()
Float valueOf() floatValue()
Double valueOf() doubleValue()
Character valueOf() charValue()
Boolean valueOf() booleanValue()
valueOf源码分析:
public static Integer valueOf(int i) {
assert IntegerCache.high>= 127;
if (i >= IntegerCache.low&& i <= IntegerCache.high)
return IntegerCache.cache[i+ (-IntegerCache.low)];
return new Integer(i);
}
通过查看原码可知,java针对-128-127之间的数据做了一个数据缓冲池。
如果数据是该范围内的,每次并不创建新的空间。
如果数据是该范围内的,就new一个空间
泛型发展
一开始,泛型是在定义类和接口时使用泛型来规定类中的某个属性的类型
在jdk1.5以后,允许在定义集合时使用泛型,使我们能在例如输入 List 这种格式来规定输入的这个参数只能保存字符串类型的参数。类似于定义了一个形参
@Test
public void test(){
ArrayList<String> list = new ArrayList(String);
list.add("wpx");
list.add("wpx");
list.add("wpx");
list.add("wpx");
list.add(123);//爆出错误,输入为int 需要输入String
不限制的话,
- 类型不安全,编译不检查
- 强转时有可能出现类型转换异常 ClassCastExceptions
如何使用泛型
在集合中使用
ArrayList list = new ArrayList(String);
前面的写上类型以后,后面的可以不用写了,
自定义泛型
可以定义泛型类 泛型接口 泛型方法
这里以泛型类举例,泛型类需要重写构造器等,调用泛型类时需要自定义一个泛型,这里的T就类似于规定了必须有泛型,但是不规定具体的是什么。
子类继承带泛型的父类,子类不需要再次指定泛型,也可以再指定一个新的泛型
public class Order{
}
自定义泛型类泛型接口的注意点
泛型不同的引用不能相互赋值
ArrayList List1 = null;
ArrayList List2 = null;
静态方法不能使用类的泛型
泛型方法
泛型方法和类是不是泛型无关,不是方法中使用了类的泛型就是泛型方法
使用情景
DAO data(base) accesss object
对应数据库的表 增删改查 操作数据的通用操作
数据库的一张表,对应Java中的一个类
但是具体对应哪个类就不确定,来表示如 Teacher Student等
一般DAO为通识DAO 加上自定义泛型 ,再在自己需要的数据库中加上自己所需数据库的表上加上自己所需的泛型
泛型在继承方面的体现
- 子类赋值给父类
- 子类字符串赋值给父类字符串
- 加了泛型后不具有子父类关系,完全并列关系
加了泛型后不具有子父类关系,完全并列关系
如何设置为通配的关系 通配符 ?
找并列关系的父类
List list1 = null;
List list2 = null;
List<?> list = null;
list= list1;
list= list2;
然后操作
List<?>不能添加数据,允许读取数据