Hello ! 我是小小。从一个啥也不会的Java小白,到Java大佬,就因为会了这一门杜门绝迹,泛型,成为令人仰慕的大佬,今天是本周的第六篇,主要内容是Java泛型
什么是泛型
例如一段代码
//创建一个List集合
ArrayList al = new ArrayList();
al.add(123); //添加基本数据类型对象
al.add("123"); //添加String对象
al.add(new Person("123")); //添加自定义Person对象
在这段代码中,如果需要添加 string类型,需要改成如下方式
//创建一个List集合 并指定集合的对象类型
ArrayList<String> al = new ArrayList<String>();
al.add("123");
al.add("iamxiarui");
即,当指定了集合中的对象类型后,集合只能保存相关的类型,如果保存的类型和指定的类型不匹配,需要进行更改。
泛型的本质是参数化类型,即,数据类型被指定为一个参数,这种参数类型可以用在类,接口和方法的创建中,即,泛型类,泛型接口,泛型方法。
格式可以更改如下
//List集合中 指定元素类型是Map集合 ,Map集合中指定的key是String类型,value是Object类型
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < icon.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
//Map中添加的key是String , value是数组中的元素,是Object类型
map.put("icon", icon[i]);
map.put("item", item[i]);
list.add(map);
}
泛型作用
解决代码中的安全
在代码编写过程中,使用泛型可以限定相关的类型,确定只有相关的类型才能使用相关的泛型。
可以把代码的异常转移到编译期间
在规定的集合中保存相应的类型,在编译期间可以检查到,减少在代码运行期间发生意外。
避免了强制类型转换的干扰
避免了代码在强制类型转换的时候,需要频繁的在前面加上括号,只需要直接使用泛型就包括的代码的类型。
限定
不明确类型的时候,用 ? 表示。即占位符
public static void print(ArrayList<?> al){
Iterator<?> it = al.iterator();
}
该方法传入参数的时候,可以被任何类型所传入。
这样非常的简洁,也同样非常的简单。
泛型上限: ? extends E 当前集合类型可以是 E 类型或者E类型的子类型
//表示可以该集合存入Person类 或者 Person 类的子类型
public static void print(ArrayList<? extends Person> al){
Iterator< extends Person> it = al.iterator();
}
泛型下限: ? super E 表示当前集合类型可以是E类型或者E类型的父类型
//表示可以该集合存入Student类 或者 Student 类的父类型
public static void print(ArrayList<? super Student> al){
Iterator<? super Student> it = al.iterator();
}
自定义泛型
泛型类:当类中引用的数据类型不确定的时候,可以定义泛型类
// 自定义泛型:定义了Generic类的类型是Person对象
class Generic<Person> {
private Person p;
public Person getP() {
System.out.println(p);
return p;
}
public void setP(Person p) {
this.p = p;
}
泛型方法:在类中的方法上定义出泛型
// 自定义泛型:定义了Generic类的类型是Person对象
class Demo{
public <T> void show(T t){
System.out.println(t);
}
<pre> public <Q> void show(Q q){
System.out.println(q);
}
}
// 类上已经定义了泛型
class GenericMethod<B> {
// 方法上没有定义泛型 则根据类确定泛型
public void getB(B b) {
System.out.println("B — " + b);
}
// 方法上已经定义了泛型 根据方法泛型来
public <C> void getC(C c) {
System.out.println("C — " + c);
}
// 静态方法 必须自定义方法泛型 不能根据类上的泛型
public static <D> void getD(D d) {
System.out.println("D — " + d);
}
泛型接口:定义接口的泛型方法
// 定义接口的泛型
interface Intet<T> {
void show(T t);
}
// 类实现接口 并自定义泛型
class GenericInterface<T> implements Intet<T> {
public void show(T t) {
System.out.println("show — " + t);
}
}
关于作者
我是小小,一枚小小的程序猿,我们下期再见~拜拜