1:什么是泛型
- 泛型:把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊类型
- java泛型的设计原则:只要编译时期没有出现警告,那么运行期间就不会出现ClassCastExpeption异常
参数化类型
- 1:把类型当做是参数一样传递
- 2:<数据类型>只能是引用类型
2:为什么需要泛型
没有泛型,集合会怎么样
- 1:Collection、Map集合对元素的类型是没有任何限制的。本来我的Collection集合装载的是全部的Dog对象,但是外边把Cat对象存储到集合中,是没有任何语法错误的。
- 2:把对象扔进集合中,集合是不知道元素的类型是什么的,仅仅知道是Object。因此在get()的时候,返回的是Object。外边获取该对象,还需要强制转换。
有了泛型以后
- 1:代码更加简洁(不需要强制转换)
- 2:程序更加健壮(只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常)
- 3:可读性和稳定性(在编写集合的时候,就限定了类型)
- 4:可以使用增强for遍历集合
//创建集合对象
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");
//遍历,由于明确了类型.我们可以增强for
for (String s : list) {
System.out.println(s);
}
3:泛型的使用
1:泛型类
泛型类就是把泛型定义在类上面,用户使用该类的时候,才把类型明确下来
/*
1:把泛型定义在类上
2:类型变量定义在类上,方法中也可以使用
*/
public class ObjectTool<T> {
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
测试
public static void main(String[] args) {
//创建对象并指定元素类型
ObjectTool<String> tool = new ObjectTool<>();
tool.setObj(new String("钟福成"));
String s = tool.getObj();
System.out.println(s);
//创建对象并指定元素类型
ObjectTool<Integer> objectTool = new ObjectTool<>();
/**
* 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了.
*/
objectTool.setObj(10);
int i = objectTool.getObj();
System.out.println(i);
}
2:泛型方法
//定义泛型方法..
public <T> void show(T t) {
System.out.println(t);
}
测试
public static void main(String[] args) {
//创建对象
ObjectTool tool = new ObjectTool();
//调用方法,传入的参数是什么类型,返回值就是什么类型
tool.show("hello");
tool.show(12);
tool.show(12.5);
}