Java泛型01:什么是泛型?
文章目录
- 一、泛型的概念
- 二、集合中没有泛型的时候
- 三、集合中有泛型的时候
- 四、总结
一、泛型的概念
- 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实 际的类型参数,也称为类型实参)。
- 从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念, 允许我们在创建集合时再指定集合元素的类型,正如:List,这表明 该List只能保存字符串类型的对象。
- JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持, 从而可以在声明集合变量、创建集合对象时传入类型实参。
⭕️:那么为什么要有泛型呢,直接Object不是也可以存储数据吗?
- 解决元素存储的安全性问题,好比商品、药品标签,不会弄错。
- 解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品、药 品都要辨别。
二、集合中没有泛型的时候
代码举例:
1.以ArrayList为例:
//在集合中使用泛型之前的情况
@Test
public void test1(){
ArrayList list = new ArrayList();
//存放学生的成绩
list.add(12);
list.add(13);
list.add(14);
list.add(15);
list.add("金士曼");
//问题一:类型不安全
for (Object obj:list) {
//问题二:强转时,可能出现异常:ClassCastException
int score=(Integer) obj;//因为添加的是学生成绩所以需要int型
System.out.println(score);
}
}
三、集合中有泛型的时候
注意:使用泛型的时候,这个泛型是一个类型,不能是基本数据类型,可以是它的包装类
包装类:Java中什么是包装类?包装类与基本数据类型如何转换?
代码:
1.以ArrayList为例
@Test
public void test2(){
ArrayList<Integer> list = new ArrayList<Integer>();
//此时泛型写的Integer,再去调用add方法的时候,如果放别的类型,编译就过不了了
list.add(32);
list.add(1232);
list.add(2);
list.add(323);
//编译时进行类型检查
// list.add("123");
//方式一:增强for循环
for(Integer score:list){
//避免了强转操作
int stuScore=score;
System.out.println(stuScore);
}
//方式二:迭代器
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
2.以HashMap为例
@Test
public void test3(){
HashMap<String , Integer> map = new HashMap<String, Integer>();
map.put("Tom",98);
map.put("Jack",89);
map.put("Jerry",69);
//一样的,放泛型以外的类型编译不会过
//泛型的嵌套
//这里Entry前面的Map点是因为他是内部类,如果要省可以导包(import java.util.Map.*;)之和就可以不写
Set<Map.Entry<String , Integer>> entry = map.entrySet();
//遍历
Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
while (iterator.hasNext()){
Map.Entry<String, Integer> e = iterator.next();
String key = e.getKey();
Integer value = e.getValue();
System.out.println(key+"---"+value);
}
}
四、总结
-
集合接口或集合类接口在jdk5.0之和都修改为带泛型的结果
-
在实例化集合类时,可以指明具体的泛型的类型(注意:泛型是类型,不是变量名)
-
指明完以后,在集合类或集合接口时,内部结构使用到类的泛型的位置,都指定为实例化时泛型的类型,
比如:add(E e)—>实例化后:add(Object e)
-
注意点:泛型的类型必须是一个类,不能是基本数据类型,需要用到基本数据类型的时候用包装类替换
-
如果实例化时没有指明泛型的类型,我们默认类型为java.long.Object
-
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生 ClassCastException异常。同时,代码更加简洁、健壮。