泛型
泛型的好处:
统一数据类型;
把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来;
泛型的细节:
java中的泛型是伪泛型,添加后,其内部依旧是按Object类型进行处理的;
泛型中不能写基本数据类型;
指定泛型的具体数据类型后,传递数据时,可以传入该类类型或者其子类类型;
如果不写泛型,类型默认是Object;
泛型的定义:
分类:
-
泛型类:
-
概念:定义在类后面的泛型称为泛型类;
-
使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类;
-
格式:此处E可以理解为变量,是用来记录数据的类型的,可以写成其他英文字符(最常见为:T、E、K、V);
修饰符 class 类名<类型>{ public class ArrayList<E>{ 修饰符 返回值类型 方法名(类型 变量名){ public E add(E e){ } } } }
-
-
泛型方法:
-
概念:方法中形参类型不确定时;
-
格式:此处T可以理解为变量,是用来记录数据的类型的,可以写成其他英文字符(最常见为:T、E、K、V);
如有多个修饰符,则把类型写在最后一个修饰符后面;
-
修饰符<类型> 返回值类型 方法名(类型 变量名){ public<T> void show(T t){ public<E> void show(ArrayList<E> list){
} } }
-
泛型接口:
-
使用方式:
方式1: 实现类给出具体类型; 写法: public class MyArrayList2 implements List<String>{},String可以换别的类型; 方式2: 实现类延续泛型, 创建对象时再确定; 写法: public class MyArrayList3<E> implements List<E>{}
-
格式:
修饰符 interface 接口名<类型>{ public interface List<E>{ } }
-
泛型的继承性和通配符:
继承性: 泛型不具备继承性,但是数据具备继承性:
1.可以再一个指定泛型的集合中添加该泛型的子类数据(数据具备继承性);
2.有一个形参是有指定泛型集合的的方法,该方法只能接收与形参一致的指定泛型集合,不能是该泛型的子类(泛型不具备继承性);
例子:
package com.caihongjia.a03mygenerics;
import java.util.ArrayList;
public class GenericsDemo5 {
public static void main(String[] args) {
//泛型不具备继承性,但是数据具备继承性
ArrayList<Ye> list1 = new ArrayList<>();
ArrayList<Fu> list2 = new ArrayList<>();
ArrayList<Zi> list3 = new ArrayList<>();
//泛型不具备继承性
method(list1);
// method(list2); 报错
// method(list3); 报错
// 数据具备继承性
list1.add(new Ye());
list1.add(new Fu());
list1.add(new Zi());
}
public static void method(ArrayList<Ye> list) {
}
}
class Ye { }
class Fu extends Ye { }
class Zi extends Fu { }
通配符:
- 分类:
1. ?:表示不确定的类型,与E等字符一个作用;
2. ? extends E : 表示可以传递E或者E所有的子类类型;
3. ? super E : 表示可以传递E或者E所有的父类类型;
-
作用:
可以用来限定类型的范围
-
例子:
// 可以使用Ye类型及其子类 public static void method(ArrayList<? extends Ye> list) { } // 可以使用Ye类型及其父类 public static void method2(ArrayList<? super Ye> list) { } // 可以使用任意类型 public static void method3(ArrayList<?> list) { }
综合练习:
-
要求:
-
实现:
package com.caihongjia.a04test;
import java.util.ArrayList;
import java.util.Iterator;
public class Test1 {
public static void main(String[] args) {
ArrayList<PersianCat> list1 = new ArrayList<>();
ArrayList<LiHuaCat> list2 = new ArrayList<>();
ArrayList<Teddy> list3 = new ArrayList<>();
ArrayList<SiberianHusky> list4 = new ArrayList<>();
}
/*
该方法能养所有品种的猫,但是不能养狗
public static void keepPet(ArrayList<? extends Cat> list){
for (Cat cat : list) {
cat.eat();
}
}
该方法能养所有品种的狗,但是不能养猫
public static void keepPet(ArrayList<? extends Dog> list){
for (Dog dog : list) {
dog.eat();
}
}
该方法能养所有的动物,但是不能传递其他类型
public static void keepPet(ArrayList<? extends Animal> list){
for (Animal animal : list) {
animal.eat();
}
}
*/
}
标签:ArrayList,list,public,类型,泛型,void
From: https://www.cnblogs.com/chj020415/p/17726082.html