Java_泛型_15

news/2025/1/9 13:56:06/

泛型

概述

  1. 什么是泛型?
    泛型就是一个标签:<数据类型>
    泛型可以在编译阶段约束只能操作某种数据类型。
    注意:JDK 1.7开始之后,泛型后面的申明可以省略不写!!
    泛型和集合都只能支持引用数据类型,不支持基本数据类型。

  2. 小结:
    泛型可以在编译阶段约束只能操作某种数据类型。
    泛型和集合都只能支持引用数据类型,不支持基本数据类型。
    JDK 1.7开始之后,泛型后面的申明可以省略不写!!

public class GenericityDemo {public static void main(String[] args) {//ArrayList<String> lists = new ArrayList<String>();ArrayList<String> lists = new ArrayList<>(); // JDK 1.7开始之后,泛型后面的申明可以省略不写!!lists.add("Java");lists.add("MySQL");
//      lists.add(false);
//      lists.add(99.9);
//      lists.add('a');System.out.println(lists);ArrayList<Integer> lists1 = new ArrayList<>();lists1.add(10);lists1.add(20);System.out.println(lists1);}
}

优势

这泛型在编译阶段约束了操作的数据类型,从而不会出现类型转换异常。
体现的是Java的严谨性和规范性,数据类型,经常需要进行统一!

	public class GenericityDemo {public static void main(String[] args) {ArrayList<String> lists = new ArrayList<>();lists.add("赵敏");lists.add("张无忌");
//        lists.add(false);  //不定义<>打印会报错
//        lists.add(99.9);for(int i = 0 ; i < lists.size() ; i++ ){String ele = lists.get(i);System.out.println(ele);}}
}

自定义泛型类

  1. 引入:
    我们之前用的泛型都是别人写好的,接下来我们来自定义泛型类使用。

  2. 泛型类的概念:
    使用了泛型定义的类就是泛型类。

  3. 泛型类的格式:
    修饰符 class 类名<泛型变量>{

    }
    泛型变量建议使用 E , T , K , V

  4. 需求:模拟ArrayList集合自定义一个集合MyArrayList集合。
    泛型类的核心思想:是把出现泛型变量的地方全部替换成传输的真实数据类型。

  5. 小结:
    自定义泛型的核心思想:是把出现泛型变量的地方全部替换成传输的真实数据类型。

public class GenericDemo {public static void main(String[] args) {MyArrayList<String> lists = new MyArrayList<String>();MyArrayList<String> lists1 = new MyArrayList<>();lists1.add("java");lists1.add("mysql");lists1.remove("java");System.out.println(lists1);}
}class MyArrayList<E>{  //自定义泛型类  需要的类型全为E!!!!private ArrayList lists = new ArrayList();public void add(E e){lists.add(e);}public void remove(E e){lists.remove(e);}@Overridepublic String toString() {return lists.toString();}
}

自定义泛型方法

  1. 什么是泛型方法?
    定义了泛型的方法就是泛型方法。

  2. 泛型方法的定义格式:
    修饰符 <泛型变量> 返回值类型 方法名称(形参列表){ }
    注意:方法定义了是什么泛型变量,后面就只能用什么泛型变量。

  3. 泛型类的核心思想:是把出现泛型变量的地方全部替换成传输的真实数据类型。

  4. 需求:给你任何一个类型的数组,都能返回它的内容。

  5. 小结:
    泛型方法和泛型类可以做通用技术架构。

public class GenericDemo {public static void main(String[] args) {Integer[] nums = {10 , 20 , 30 , 40 , 50};String rs1  = arrToString(nums);System.out.println(rs1);String[] names = {"贾乃亮","王宝绿","陈羽凡"};String rs2  = arrToString(names);System.out.println(rs2);}
//T可以传任何类型,即实现了通用性。public static <T> String arrToString(T[] nums){StringBuilder sb = new StringBuilder();sb.append("[");if(nums!=null && nums.length > 0){for(int i = 0 ; i < nums.length ; i++ ){T ele = nums[i];sb.append(i == nums.length-1 ? ele : ele+", ");}}sb.append("]");return sb.toString();}
}

泛型接口的使用

  1. 什么是泛型接口?
    使用了泛型定义的接口就是泛型接口。

  2. 泛型接口的格式:
    修饰符 interface 接口名称<泛型变量>{ }

  3. 需求:教务系统,提供一个接口可约束一定要完成数据(学生,老师)的增删改查操作

  4. 小结:
    泛型接口的核心思想,在实现接口的时候传入真实的数据类型
    这样重写的方法就是对该数据类型进行操作!

1.创建Data泛型接口

public interface Data<E> {void add(E stu);void delete(E stu);void update(E stu);E query(int id);
}

2.Teacher类继承泛型接口并重写方法

public class TeacherData implements Data<Teacher> {@Overridepublic void add(Teacher stu) {System.out.println("添加老师!");}@Overridepublic void delete(Teacher stu) {System.out.println("删除老师!");}@Overridepublic void update(Teacher stu) {}@Overridepublic Teacher query(int id) {return null;}
}

3.student类继承泛型接口并重写方法

public class StudentData implements Data<Student> {@Overridepublic void add(Student stu) {System.out.println("添加学生!");}@Overridepublic void delete(Student stu) {System.out.println("删除学生!");}@Overridepublic void update(Student stu) {}@Overridepublic Student query(int id) {return null;}
}

4.main调用

public class GenericDemo {public static void main(String[] args) {StudentData data = new StudentData();data.add(new Student());data.delete(new Student());TeacherData data1 = new TeacherData();data1.add(new Teacher());data1.delete(new Teacher());}
}

通配符和上下限

  1. 需求:开发一个极品飞车的游戏,所有的汽车都能一起参与比赛。

  2. 注意:
    虽然BMW和BENZ都继承了Car
    但是ArrayList和ArrayList与ArrayList没有关系的!泛型没有继承关系!

  3. 通配符:?
    ?可以用在使用泛型的时候代表一切类型。
    E , T , K , V是在定义泛型的时候使用代表一切类型。

  4. 泛型的上下限:
    ? extends Car : 那么?必须是Car或者其子类。(泛型的上限)
    ? super Car :那么?必须是Car或者其父类。(泛型的下限。不是很常见)

  5. 小结:
    通配符:?可以用在使用泛型的时候代表一切类型。
    ? extends Car : 那么?必须是Car或者其子类。(泛型的上限)

public class GenericDemo {public static void main(String[] args) {ArrayList<BMW> bmws = new ArrayList<>();bmws.add(new BMW());bmws.add(new BMW());bmws.add(new BMW());run(bmws);ArrayList<BENZ> benzs = new ArrayList<>();benzs.add(new BENZ());benzs.add(new BENZ());benzs.add(new BENZ());run(benzs);ArrayList<Dog> dogs = new ArrayList<>();dogs.add(new Dog());dogs.add(new Dog());dogs.add(new Dog());// run(dogs); // 就进不来了!}// 定义一个方法,可以让很多汽车一起进入参加比赛public static void run(ArrayList<? extends Car> cars){}
}
class Car{}
class BMW extends Car{}
class BENZ extends Car{}
class Dog{}

http://www.ppmy.cn/news/561595.html

相关文章

JUC阻塞队列BlockingQueue---DelayQueue

JUC阻塞队列BlockingQueue---DelayQueue DelayQueueDelayed接口 使用原理构造方法常量入队put方法出队take方法步骤总结 什么是阻塞队列&#xff1f; DelayQueue DelayQueue 是一个支持延时获取元素的阻塞无界队列&#xff0c; 内部采用优先队列 PriorityQueue 存储元素&…

Nexus3首次登录默认密码

Nexus3 版本&#xff1a;3.41.1 目前的 Nexus3 用户名 admin 的初始化密码不再是 admin123&#xff0c;需要在文件中去查看密码。 cat /opt/sonatype/sonatype-work/nexus3/admin.password 输出后的密码是一个 uuid&#xff0c;这个就是密码&#xff0c;不要考虑太多&#x…

达梦数据库表解锁

select concat(call sp_close_session(,SESS_ID,);) from (select distinct c.SESS_IDfrom v$lock ajoin sysobjects b on b.IDa.TABLE_IDjoin v$sessions c on a.TRX_IDc.TRX_ID and b.name表名);

Dell服务器iDRAC卡重置密码怎么操作?

环境&#xff1a;DellR630服务器&#xff08;也主要用于R720、R730、R620、R420、R530&#xff09; 问题&#xff1a;DellR630服务器iDRAC忘记密码。 表明&#xff1a;13代机器默认iDRAC账号密码为&#xff1a;root/calvin。14代机器默认iDRAC账号为root。密码在机器前小抽拉…

oppo r11 r11t解BL锁安装面具magisk详细教程

OPPO r11 r11t是高通骁龙660处理器&#xff0c;这个系列要解bl锁网上有很多教程比较http://rom点7to点cn/jiaochengdetail/16880 解好BL锁后就可以找三方rec&#xff0c;刷入rec 进入三方rec&#xff0c;把小包发送到手机硬盘&#xff0c;安装小包&#xff0c;再次重启进入三方…

Sonatype Nexus 管理员初始密码

如果是第一次进行登录的话&#xff0c;我们会看到下面的界面。 在这个界面中可以找到管理的密码。 登录后提示修改管理员密码。 提示是否允许匿名访问。 如果是公司自己的服务器话&#xff0c;就不需要启用匿名访问了。 Sonatype Nexus 管理员初始密码 - 编译集成 - OSSEZ如果…

诺基亚X1-01 sim2卡要输入保密码

我的手机是双卡双待的 诺基亚X1-01&#xff0c;之前两种卡&#xff0c;sim1&#xff1a;联通&#xff0c; sim2移动&#xff0c; 后来&#xff0c;临时将sim1换了一张临时移动卡用了两周。 今天见sim1换回以前的联通&#xff0c;结果开机提示输入保密码&#xff0c;诺基亚默认…

Nexus3忘记管理员密码并修改密码的操作

Nexus3忘记管理员密码并修改密码 Nexus3内置使用的数据库为orientdb&#xff0c;可以通过连接orientdb来修改管理员密码 1. 停止Nexus3服务 # windows中&#xff0c;nexus3是注册的服务名&#xff0c;可修改为自己的服务名 net stop nexus3 # 或进入到安装目录下 ./nexus stop…