一、啥是泛型

概述

  泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。

格式

  类名<类型名>

标记符

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类
  • K - Key(
  • V - Value(
  • N - Number(数值
  • -  表示不确定的java类型(通配符
  • SUV、 - 用在第2、3、4个参数类型时使用

二、代码走一波

汽车类

/**
* 汽车类
*/
@Data
public class Car {
/*无参构造*/
public Car() { } /*带参构造*/
public Car(int id, String name, String Type) {
this.id = id;
this.name = name;
this.Type = Type;
} /*属性*/
private int id;//编号
private String name;//名称
private String Type;//类型
}

猫猫类

/**
* 宠物类
*/
@Data
public class Pet {
/*无参构造*/
public Pet() { } /*带参构造*/
public Pet(int id, String name, String Type) {
this.id = id;
this.name = name;
this.Type = Type;
} /*属性*/
private int id;//编号
private String name;//名称
private String Type;//类型
}

泛型类

/**
* 泛型测试类
*
* @param <T> 参数1(泛型对象)
* @param <S> 参数2(继承Pet类的泛型对象)
*/
@Data
public class User<T, S extends Pet> {
/*带参构造*/
public User(int id, String name, String Type, List<T> t, List<S> s) {
this.id = id;
this.name = name;
this.Type = Type;
this.tList = t;
this.sList = s;
} /*泛型属性*/
private List<T> tList;//泛型List
private List<S> sList;//继承Pet类的泛型List /*一般属性*/
private int id;//编号
private String name;//名称
private String Type;//类型 /*重写toString()方法*/
@Override
public String toString() {
String msg = "id为【%s】的【%s】用户【%s】拥有猫猫【%s】和汽车【%s】";
return String.format(msg, this.id, this.Type, this.name, this.sList.toString(), this.tList.toString());
}
}

测试类

/**
* 测试类
*/
public class Test {
public static void main(String args[]) {
List<Pet> petList = new ArrayList<Pet>();
petList.add(new Pet(1, "汤圆", "英短"));
petList.add(new Pet(2, "糯米", "英短"));
petList.add(new Pet(3, "咖喱", "田园")); List<Car> carList = new ArrayList<Car>();
carList.add(new Car(1, "标志", "小轿车"));
carList.add(new Car(2, "哈弗", "SUV")); User user = new User(1, "ZH", "男性", carList, petList);//第5个参数如果不是一个继承了Pet类的List,则编译会报错
System.out.println(user.toString());
}
}

输出

小结

  我们知道Object类是所有类的父类,在引入泛型概念之前,我们常用Object的引用来实现参数的“任意化”。

痛点:

  • 要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。
  • 对于强制类型转换错误的情况 ,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型的好处:

  • 通过IDE进行代码类型初步检查,然后在编译阶段进行编译类型检查避免运行时异常,以保证类型转换的安全性。
  • 所有的强制转换都是自动和隐式的,可以提高代码的重用率。

Java基础一篇过(二)泛型的更多相关文章

  1. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  2. java基础-引用数据类型之二维数组(Array)

    java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...

  3. Java 基础(一)| 使用泛型的正确姿势

    前言 为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是泛型 泛型,即&qu ...

  4. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

  5. java基础——入门篇

    整体大纲图 1.认识java 核心知识点:JVM.搭建Java开发环境.java的发展史.java特点.java程序类型.垃圾收集器.J2SE下载和安装.环境变量的配置和测试.以及简单的开发工具的使用 ...

  6. JAVA基础——编程练习(二)

    JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...

  7. java基础梳理--朝花夕拾(二)

    1.Java语言语法规则和文件格式: 第一个Java程序:/** 第一个Java程序:控制台输出Hello world!*/public class Test{    //访问修饰符 class关键词 ...

  8. JS基础入门篇(二十七)—BOM

    虽然上次写到js基础篇(二十四),这次直接写到(二十七).是为了提醒自己中间有几篇没写.特此说明一下啊. 1.window.open() 使用a标签呢,点击一下a标签页面才会跳转,有时候我们需要做的操 ...

  9. 夯实Java基础(十八)——泛型

    1.什么是泛型 泛型是Java1.5中出现的新特性,也是最重要的一个特性.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类. ...

  10. Java基础学习总结(二)

    Java语言的特点: Java语言是简单的 Java语言是面向对象的 Java语言是跨平台(操作系统)的(即一次编写,到处运行) Java是高性能的 运行Java程序要安装和配置JDK jdk是什么? ...

随机推荐

  1. Magento 2 Factory Objects

    In object oriented programming, a factory method is a method that’s used to instantiate an object. F ...

  2. max user processes 导致的服务器大量close_wait问题解决过程

    1.背景: 由于现网业务量增长过快,需要扩容应用程序服务器,分担来自前端的访问压力. 2.故障: 部署好业务启动程序后,发现程序运行一小会后不产生新的日志和数据. 3.查问题过程: 1.首先查看程序运 ...

  3. springMVC入门(八)------拦截器

    简介 springMVC拦截器针对处理器映射器进行拦截配置 如果在某个处理器映射器中配置拦截,经过该处理器映射器映射成功的Handler最终使用该拦截器 由于springMVC支持配置多个处理器映射器 ...

  4. BIGI行情-实时行情数据源接口websocket接入方法

    BIGI行情-实时行情数据源接口socket接入方法1.国际期货.国内期货.外汇.贵金属.现货.期权.股指.数字货币和A股实时行情和历史行情2.推送的有:socket,websocket,http接收 ...

  5. python连接mysql中报错1064修改方法

    Python是编程语言,MySQL是数据库,它们是两种不同的技术:要想使Python操作MySQL数据库需要使用驱动.这里选用PyMySQL驱动.下载地址: https://pypi.python.o ...

  6. static,private,final,abstract,protected

    1,static:静态变量:位于方法区中,只有一份,这个类的所有实例共享,不可以被继承 静态方法:直接通过类就能调用,静态方法中只能使用静态变量,不可以被继承 2,private:类不能用privat ...

  7. SEO工程师考试题目

    http://www.wocaoseo.com/thread-201-1-1.html      SEO,全名Search Engine Optimization,其中文名字为'搜索引擎优化' .其英 ...

  8. 借助FRP反向代理实现内网穿透

    一.frp 是什么? frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便捷的方式通过具有公网 IP 节点的中转暴露到公 ...

  9. mysql 8.0.19 win10快速安装教程

    本文教程为大家分享了mysql 8.0.19安装教程,供大家参考,具体内容如下 1.下载.zip安装文件 2.根目录存放my.ini,文件路径用“/”分割,例如: [mysqld] port=3306 ...

  10. 2020.08.31 Unit 10(暂未完成)

    [重点短语] 01.at night 在晚上 02.in a more natural environment 在一个更加自然的环境中 03.all year round 一年到头,终年 04.be ...