泛型 在 jdk 1.5 的时候增加,本质是参数化类型,也就是说操作的数据类型被执行为一个参数,使代码可以应用于多种类型。我的感觉让集合存储指定的类型,
好处:安全简单,所有强制转化都是自动和隐式进行的,提高了代码重用率。
定义:把对象类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。
本质:参数化类型
格式:
类1或接口 <类型实参> 对象 = new 类2 <类型实参> (); //注意: //类2 可以与类1相同,也可以是类1 的子类,或其接口的实现类 //类2 和 类1 的 类型实参必须相同
在集合中使用泛型
使用泛型后,原来通过get() 方法取出对象时,不用强转了,避免了容易出现的 ClassCastException, 但是,使用泛型后,不能再往该集合中存储与类型实参不同的类型数据
package com.obge.boge; import com.obge.model.Animal; import java.util.*; public class GenericityStu { public static void main(String[] args) { //弄个类 Animal dog1 = new Animal("小白",22,"雄"); Animal cat1 = new Animal("小橘",22,"雄"); //放在list 集合中 有序不唯一 List<Animal> alist = new ArrayList<Animal>(); alist.add(dog1); alist.add(cat1); //遍历出来 for(Animal animal:alist){ System.out.println("list 集合获取名字"+animal.getName()); } LinkedList<Animal> alinklist = new LinkedList<>(); alinklist.add(dog1); alinklist.addFirst(cat1); //遍历出来 for(Animal animal :alinklist){ System.out.println("list 集合下的LinkedList获取名字"+animal.getName()); } System.out.println("******** obge *************"); //放在Set 集合中 无序 唯一 HashSet<Animal> aset = new HashSet<Animal>(); aset.add(dog1); aset.add(cat1); //遍历出来 Iterator<Animal> iterator = aset.iterator(); while(iterator.hasNext()){ System.out.println("set 集合获取名字"+iterator.next().getName()); } System.out.println("**********obge*********"); //放在 Map 集合中 key 无序不重复 value 无序可重复 Map<String,Animal> amap = new HashMap<String, Animal>(); amap.put("小狗",dog1); amap.put("小猫",cat1); //遍历 key for(String key:amap.keySet()){ System.out.println("键来"+key); } //遍历 value for(Animal value : amap.values()){ System.out.println("值来"+value.getName()); } System.out.println("键名小狗相应的值的对象名为:"+amap.get("小狗").getName()); } }
存储数据是进行严格类型检查,确保只有何事类型的对象才能存储在集合中,遍历时免去了强制类型转换
在其他地方使用泛型
集合中使用泛型只是泛型多种类型的一种,在接口、类、方法等方面也有这广泛的有应用
参数化类型的重要性允许创建一些接口、类、方法,所操作的数据类型定义为参数,真正使用时指定具体类型
参数化类型:包含一个类或接口,以及实际的类型参数列表。
类型变量:一种非限定性标识符,用来指定类、接口或者方法的类型
1、定义泛型类、泛型接口和泛型方法
使用场景:对于一些常常处理不同类型的数据转换的接口或类
泛型类:具有一个或多个类型参数的类
定义泛型类语法格式:
访问修饰符 calss 类名<TypeList>{
}
//TypeList 表示类型参数列表,每个类型变量之间使用 逗号分隔
实例化泛型类语法格式
new 类名 <TypeList>(argList); //TypeList 表示定义的类型列表,可以有多个 //argList 实际传递的类型参数列表,每个类型变量之间使用逗号分隔