集合
泛型和工具类
泛型
- 本质是参数化类型,把类型作为参数传递
- 常见形式:泛型类,泛型接口,泛型方法
- 语法:
- <T,…> T称为类型占位符,表示一种引用类型
- 好处
- 提高代码的重用性
- 防止类型转换异常,提高代码的安全性
举个例子,你定义了一个集合list,然后开始往集合中添加元素
list.add("更生");
list.add("甦");
list.add(100);//这里会自动装箱包装成Interger类
看起来是没有问题的,系统也不会认为有问题,但事实上前两个元素是String类,后一个是Interger类型,在使用时必然会出问题,就如在遍历时,以迭代器为例,原本是这样的
while (it.hasNext()){
String s =(String) it.next();
System.out.println(s);
}
但这样一定会报错,因为有一个元素不是String类型,但同时又不能给一个对象定义两种毫无关系的类型,所以系统抛出了异常
我们发现,因为创建集合时并没有规定添加类型,所以编译时不会报错,然而,这样会有很大的漏洞,因为这个错误只有在运行时才能显现出来,也就是说会大大降低开发时的调试效率
所以我们提出了泛型的概念,即把数据类型作为变量,这样就能在一开始规定集合的数据类型,如此一来,在你添加100这个元素时就会报错,即在编译阶段就能找到错误,增大了容错率
泛型类
- 语法
- 类名< T >
- T是类型占位符,表示一种引用类型,且不可是基本类型,如果编写多个,使用逗号隔开
我们先来创建一个变量
//使用泛型
//1.创建变量
T t;
这里是不能用new的,因为根本不知道是哪种类型
再来演示一下在方法中的应用,泛型是可以作为方法的参数的
//2.添加方法,作为方法的参数
public void show(T t){
System.out.println(t);
}
还可以作为方法的返回值
//3.泛型作为方法的返回值
public T getT(){
return t;
}
合到一起如下
package com.assemble.myGeneric;
/*
泛型类
语法:类名<T> 占位符表示数据类型,且可以写多个泛型
T是类型占位符,表示一种引用类型,且不可是基本类型,如果编写多个,使用逗号隔开
*/
public class Demo01<T> {
//使用泛型
//1.创建变量
T t;
//2.添加方法,作为方法的参数
public void show(T t){
System.out.println(t);
}
//3.泛型作为方法的返回值
public T getT(){
return t;
}
}
接下来我们建一个测试类
使用泛型类创建对象
//使用泛型类创建对象
Demo01<String> myGeneric=new Demo01<String>();
Demo01<Integer> myGeneric2=new Demo01<Integer>();
使用方法
myGeneric.t="hello";
myGeneric.show("大家好");
myGeneric.getT();
myGeneric2.t=100;
myGeneric2.show(200);
Integer integer=myGeneric2.getT();
完整代码为
package com.assemble.myGeneric;
public class Test {
public static void main(String[] args) {
//使用泛型类创建对象
Demo01<String> myGeneric=new Demo01<String>();
myGeneric.t="hello";
myGeneric.show("大家好");
myGeneric.getT();
Demo01<Integer> myGeneric2=new Demo01<Integer>();
myGeneric2.t=100;
myGeneric2.show(200);
Integer integer=myGeneric2.getT();
}
}
/*
注意:
1. 泛型只能使用引用类型
2. 不同泛型类型对象之间不能相互赋值
*/
输出为
大家好
200