【JavaEE进阶系列 | 从小白到工程师】泛型的详细介绍使用与类型通配符,直接上手
文章目录
- 💨更多相关知识👇
- 一、什么是泛型
- 二、泛型的好处
- 三、泛型的定义格式
- 四、可以定义泛型的地方
- 五、泛型类
- 🍂泛型类的定义格式
- 🌟代码演示
- 🍂泛型类的使用
- 六、泛型接口
- 🍂泛型接口的定义格式
- 🌟代码演示
- 情况1:普通实现类实现泛型接口(当类没有泛型的时候,实现泛型接口的时候,就给它确定类型)
- 情况2:泛型类实现泛型接口 (实现类的泛型可以传给接口的泛型然后找机会确定类型)
- 🍂泛型接口使用
- 七、泛型方法
- 🍂 泛型方法定义格式
- 🌟代码演示
- 🍂泛型方法使用
- 八、类型通配符
- 🍂类型通配符 ?
- 🍂使用注意
- 🍂类型通配符上下限
- (1)类型通配符上限
- (2)类型通配符下限
- 🌟代码演示
- 九、泛型的注意
- 作者:KJ.JK
💨更多相关知识👇
💖Spring中的创建对象的三种方式、第三方资源配置管理详细描述及使用(XML版完结篇)
💖Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)
💖Spring中的依赖注入、setter与构造器注入、自动装配与集合注入详细描述及使用(XML版中篇)
💖异常处理与解决方案详解上篇
💖异常处理与解决方案详解下篇
💖Math类与System类的常用方法使用
💖JavaEE中的静态方法定义、方法重载要求、return作用详解
💖List接口的常用方法,精华总结
💖JavaEE中的Stream流的常用方法
💖JavaEE中的Stream流知识点使用,精华总结,一文直接上手
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: KJ.JK
欢迎大家点赞👍收藏💖评论💬关注🔒
💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者
💨推荐一款实用的模拟面试、刷题练习算法的神器、适用于所有的程序猿👉点击开始免费刷题,跟着博主走上巅峰💪
一、什么是泛型
泛型: 是"JDK5"中引入的特性,它提供了"编译时类型安全检测机制"
二、泛型的好处
* 把运行时期的问题提前到了编译期间
* 避免了强制类型转换
* 顾名思义,就是"将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型"
* 这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
//存入的时候没有限制类型,拿出来的时候,不知道用什么类型来接,可以定义泛型
三、泛型的定义格式
* <类型>
尖括号里面可以任意书写,按照变量的定义规则即可,一般只写一个大写字母
比如:<E> <T>
* <类型1, 类型2>
指定多种泛型格式,多种类型之间用逗号隔开
比如:<K, V>
四、可以定义泛型的地方
* 定义在类后面(泛型类) ArrayList<E>
* 定义在接口后面(泛型接口) Iterator<E>
* 定义在方法申明上(泛型方法)
五、泛型类
🍂泛型类的定义格式
格式:
修饰符 class 类名<泛型标记> { }
范例:
public class Student<T> { }
//此处<>中可以随便写个任意标识,常见的如T、E、K、V等形式的代号常用于表示泛型
🌟代码演示
//泛型类
//<E> 代表某一种数据类型
public class Box<E> {
public E getValue() {
return value;
}
public void setValue(E value) {
this.value = value;
}
private E value;
}
public class Test {
/*
泛型定义格式
public class 类名<泛型>{
}
确定泛型的时机
创建对象时,确定泛型的类型
*/
public static void main(String[] args) {
//创建泛型类的对象
Box <Integer> b1=new Box<>();
b1.setValue(13);
Integer value = b1.getValue();
System.out.println(value);
Box <String> b2=new Box<>();
b2.setValue("张三");
String s2=b2.getValue();
System.out.println(s2);
}
}
🍂泛型类的使用
* 泛型类在创建对象时确定泛型的真实类型
* 类中引用到泛型的地方都会替换成具体类型
六、泛型接口
🍂泛型接口的定义格式
格式:
修饰符 interface 接口名<泛型标记> { }
范例:
public interface MyList<T> { }
🌟代码演示
//泛型接口
public interface MyList<E> {
void add (E s);
E get(int index);
}
情况1:普通实现类实现泛型接口(当类没有泛型的时候,实现泛型接口的时候,就给它确定类型)
//实现接口的时候,确定泛型的类型
public class MyArrayList implements MyList<String>{
@Override
public void add(String s) {
}
@Override
public String get(int index) {
return null;
}
}
//当类没有泛型的时候,实现泛型接口的时候,就给它确定类型
情况2:泛型类实现泛型接口 (实现类的泛型可以传给接口的泛型然后找机会确定类型)
//当实现类也是泛型的时候,那么实现类的泛型可以传给接口
public class MyArray <T> implements MyList<T>{
@Override
public void add(T s) {
}
@Override
public T get(int index) {
return null;
}
}
public class Demo {
public static void main(String[] args) {
MyArray<String> my=new MyArray<>();
}
}
🍂泛型接口使用
* 实现类"实现接口" 时 "确定泛型"
* 接口中引用泛型的地方会替换成具体类型
七、泛型方法
🍂 泛型方法定义格式
格式:
修饰符 <泛型标记> 返回值类型 方法名(类型 变量名) { }
范例:
public <T> void show(T t) { }
🌟代码演示
public class Main {
public static void main(String[] args) {
// int [] arr1={11,22,33};
// printArray(arr1); //泛型只能接受引用类型
Integer [] arr={11,22,33};
printArray(arr);
String [] arr3={"a","b"};
printArray(arr3);
}
//<T> 这里是定义泛型 //使用泛型
public static <T> void printArray(T [] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i== arr.length-1){
System.out.print(arr[i]);
}else{
System.out.print(arr[i]+",");
}
}
System.out.println("]");
}
// 未使用泛型的时候,只能使用int传参
// public static void printArray(int [] arr){
//
// System.out.print("[");
//
// for (int i = 0; i < arr.length; i++) {
// if(i== arr.length-1){
// System.out.print(arr[i]);
// }else{
// System.out.print(arr[i]+",");
// }
// }
// System.out.println("]");
// }
}
🍂泛型方法使用
* 调用方法,"传参时确定泛型类型"
* 方法中"引用泛型的地方"会替换成"具体类型"
八、类型通配符
🍂类型通配符 ?
当使用泛型的时候,无法确定泛型的具体类型时,可以使用通配符 ? 来表示某一种类型
🍂使用注意
* 泛型通配符 <?> 是在"使用泛型"的时候,用来代表某种类型的符号
* 前面出现的 "<E> <T> " 等,虽然也是代表某种类型,但是在"定义泛型"的时候使用的
🍂类型通配符上下限
(1)类型通配符上限
格式 :
<? extends 父类> 表示类型只能是 "父类" 或者 "父类的子类" (上限)
范例 :
<? extends car> 表示类型只能是 "car" 或者 "car的子类" (上限)
//最高为父类
(2)类型通配符下限
格式 :
<? super 父类> 表示类型只能是 "父类" 或者 "父类的父类" (下限)
范例 :
<? super car> 表示类型只能是 "car" 或者 "car的父类" (下限)
//最低为父类
🌟代码演示
import java.util.ArrayList;
import java.util.regex.Pattern;
public class QQplay {
public static void main(String[] args) {
//上限
// ArrayList<Audi> audis =new ArrayList<>();
// audis.add(new Audi());
// audis.add(new Audi());
//
// play(audis);
//
// ArrayList<Jeep> jeeps =new ArrayList<>();
//
// play(jeeps);
//下限
ArrayList<car> cars=new ArrayList<>();
play(cars);
ArrayList<Object> obj=new ArrayList<>();
play(obj);
}
//<?> 泛型通配符, ?表示可以匹配任意类型
//通配符可以规定类型的上限和下限
//<? extends car> 表示类型只能是car 或者car的子类 (上限)
// public static void play(ArrayList<? extends car> list){
//
// }
// <? super car> 表示类型只能是car 或者car的父类 (下限)
public static void play(ArrayList<? super car> list){
}
//泛型没有多态 , 没有重载
// public static void play(ArrayList<Car> list){
//
// }
}
九、泛型的注意
* 泛型没有多态,没有重载
* 泛型只能接受"引用类型"
作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习