Java高级编程——泛型(泛型类、泛型接口、泛型方法,完成详解,并附有案例+代码)
泛型
21.1 概述
JDK5中引入的特性,在编译阶段约束操作的数据类型,并进行检查
泛型格式:<数据类型>
泛型只能支持引用数据类型,如果写基本数据类型需要写对应的包装类。
泛型好处:
- 统一数据类型
- 把运行时期的问题提到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。
泛型细节:
-
泛型中不能写基本数据类型
因为基本数据类型不能转成Object类型,包装类才能转成Object类型
-
指定泛型后传递数据时,可以传入该类类型或者其子类类型
-
如果不写泛型,类型默认是Object
21.2 泛型类
使用场景:当一个类中,某个变量的数据类型不确定时,可以定义带有泛型的类。
格式:
修饰符 class 类名<类型>{
....
}
举例:
E可以理解为变量,但不是变量,不是记录数据的,是用来记录数据类型的
public class ArrayList<E>{
//..... 当创建给类对象时,E就确定类型
}
//自定义泛型类
public class MyArrayList<E>{
Object[] obj = new Object[5];
int size; // size:表示长度,即存了几个元素
// E:表示不确定的类型
// e:形参的名字,变量名
// 添加元素
public boolean add(E e){
obj[size] = e;
size++;
return true;
}
// 获取元素
public E get(int index){
return (E) obj[index];
}
// 重写toString方法
@Override
public String toString() {
return Arrays.toString(obj);
}
}
==================================================
public class Test {
public static void main(String[] args) {
//创建自己定义泛型类的对象
MyArrayList<String> list = new MyArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);
//[aaa, bbb, ccc, null, null]
String s = list.get(0);
System.out.println(s);//aaa
MyArrayList<Integer> list1 = new MyArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
Integer integer = list1.get(1);
System.out.println(integer);//2
}
}
21.3 泛型方法
方法中形参类型不确定时:
-
方案1:使用类名后定义的泛型(如21.2中的add方法)
在本类里所有方法都可以用
-
方案2:在方法申明上定义自己的泛型
只有本方法能用
格式:
修饰符 <类型> 返回值类型 方法名(类型 变量名){
}
举例:
public <T> void show(T t){
// 调用该方法时,T才能确定类型
}
public class ListUtil {
// 私有化构造方法,不让外界本类的对象
private ListUtil(){}
// 类中定义静态方法addAll, 用来添加多个集合的元素
//public static <E> void addAll(ArrayList<E> list,E e1,E e2){
// list.add(e1);
// list.add(e2);
// }
//可变参数 E...e
public static <E> void addAll(ArrayList<E> list,E...e){
for (E element : e) {
list.add(element);
}
}
public void show(){
System.out.println("这是自定义工具类....");
}
}
==========================================
public class Test {
public static void main(String[] args) {
// 在创建对象时,就可以确定泛型方法的形参类型
ArrayList<String> list = new ArrayList<>();
ListUtil.addAll(list,"6","8");
System.out.println(list);//[6, 8]
ArrayList<Integer> list2 = new ArrayList<>();
ListUtil.addAll(list2,5,1);
System.out.println(list2);//[5, 1]
}
}
21.4 泛型接口
格式:
修饰符 interface 接口名<类型>{
}
举例:
public interface List<E>{
}
泛型接口的两种使用方式:
1.实现类给出具体的类型
2.实现类延续泛型,创建实现类对象时再确定类型
// 1.实现类给出具体的类型,实现List接口
public class MyArrayList2 implements List<String> {
// 省略重写List里的抽象方法
}
==================================================
public class Test {
public static void main(String[] args) {
//MyArrayList集合中只能存字符串,
//创建MyArrayList对象时不用指定泛型
MyArrayList list = new MyArrayList();
list.add("666");
}
}
// 2.实现类延续泛型,创建实现类对象时再确定类型
public class MyArrayList02<E> implements List<E> {
// 省略重写List里的抽象方法
}
==================================================
public class Test02 {
public static void main(String[] args) {
// 2.实现类延续泛型,创建实现类对象时再确定类型
MyArrayList02<Integer> list = new MyArrayList02<>();
list.add(6);
}
}
原文地址:https://blog.csdn.net/weixin_54555405/article/details/142315348
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!