【java基础核心大总结(九)】

2023-11-01

泛型

在 Jdk1.5 中,提出了一种新的概念:泛型,那么什么是泛型呢?

泛型其实就是一种参数化的集合,它限制了你添加进集合的类型。泛型的本质就是一种参数化类型。多态也可以看作是泛型的机制。一个类继承了父类,那么就能通过它的父类找到对应的子类,但是不能通过其他类来找到具体要找的这个类。泛型的设计之处就是希望对象或方法具有最广泛的表达能力。

下面来看一个例子说明没有泛型的用法

List arrayList = new ArrayList();
arrayList.add("cxuan");
arrayList.add(100);

for(int i = 0; i< arrayList.size();i++){
    String item = (String)arrayList.get(i);
		System.out.println("test === ", item);
}

这段程序不能正常运行,原因是 Integer 类型不能直接强制转换为 String 类型

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

如果我们用泛型进行改写后,示例代码如下

List<String> arrayList = new ArrayList<String>();arrayList.add(100);

这段代码在编译期间就会报错,编译器会在编译阶段就能够帮我们发现类似这样的问题。

泛型的使用

泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法,下面我们就来一起探讨一下。

用泛型表示类

泛型可以加到类上面,来表示这个类的类型

//此处 T 可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
public class GenericDemo<T>{ 
    //value 这个成员变量的类型为T,T的类型由外部指定  
    private T value;

    public GenericDemo(T value) {
        this.value = value;
    }

    public T getValue(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
        return value;
    }

 		public void setValue(T value){
	      this.value = value
    }
}
用泛型表示接口

泛型接口与泛型类的定义及使用基本相同。

//定义一个泛型接口
public interface Generator<T> {
    public T next();
}

一般泛型接口常用于 生成器(generator) 中,生成器相当于对象工厂,是一种专门用来创建对象的类。

泛型方法

可以使用泛型来表示方法

public class GenericMethods {
  public <T> void f(T x){
    System.out.println(x.getClass().getName());
  }
}
泛型通配符

无限制通配符<?>

List 是泛型类,为了 表示各种泛型 List 的父类,可以使用类型通配符,类型通配符使用问号(?)表示,它的元素类型可以匹配任何类型。例如

public static void main(String[] args) {
    List<String> name = new ArrayList<String>();
    List<Integer> age = new ArrayList<Integer>();
    List<Number> number = new ArrayList<Number>();
    name.add("cxuan");
    age.add(18);
    number.add(314);
    generic(name);
    generic(age);
    generic(number);   
}

public static void generic(List<?> data) {
    System.out.println("Test cxuan :" + data.get(0));
}

上界通配符

在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类,这样有两个好处:

  • 如果传入的类型不是 E 或者 E 的子类,编辑不成功
  • 泛型中可以使用 E 的方法,要不然还得强转成 E 才能使用

举个例子:

private <K extends ChildBookBean, E extends BookBean> E test2(K arg1, E arg2){
    E resu
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【java基础核心大总结(九)】 的相关文章

随机推荐

  • 基于SSM的校园学生管理系统的设计与实现

    全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文末获取项目下载方式 一 项目背景介绍 校园学生管理系
  • pc 电商平台----search模块

    目录 vuex中的模块化 Object assign 用法 watch监听 数组方法splice与split splice split 方法 数组去重 自定义分页器 vuex中的模块化 vuex使用三部曲 写请求 页面dispatch派发a
  • java TreeSet 和 TreeMap 源码解读

    目录 一 前言 二 TreeSet详解 1 TreeSet简介 2 TreeSet的底层实现 0 准备工作 1 TreeSet构造器 2 匿名内部类实现接口的多态 3 TreeMap构造器 4 add方法 5 put方法和put方法 6 继
  • js日期时间篇

    创建 var date new Date 参数 参数 可选 1 不填写默认为当前时间 2 year month day hours minutes seconds milliseconds 格式 new Date 年 月 日 时 分 秒 毫
  • java assert关键字

    1 仅仅用于调试 发布不生效 2 两种用法 assert 布尔表达式 assert 布尔表达式 自定义输出信息 3 需要再idea中配置vm options ea boolean isSafe false assert isSafe isS
  • TensorFlow安装并在Pycharm搭建环境

    Anaconda安装 anaconda官方下载地址 https www anaconda com products individualhttps www anaconda com products individual 注意 此处要勾选第
  • Node.js——npm管理工具介绍

    概述 Npm是NodeJS包管理工具 在最新版本中Nodejs集成了npm 可以通过输入 npm v 来测试是否成功安装 如果你安装的是旧版本的 npm 可以通过 npm 命令来升级 命令如下 sudo npm install npm g
  • Java数组的学习(基础二)

    目录 友情提醒 第一章 数组的概念介绍 1 数组的概念 2 数组的初始化 数组的创建 数组的定义 第二章 数组的使用 数组添加元素的方法 数组的赋值 数组的遍历 数组之选择排序的升序 数组之冒泡排序的升序 数组的最小值 数组的反转 数组中常
  • 【SQL Server系列】_03关系数据库与关系代数

    文章目录 一 关系模型的数据结构及其形式化定义 1 关系的形式化定义及其有关概念 2 关系的性质 3 关系模式 4 关系数据库和关系数据库模式 二 关系的码和关系的完整性 1 候选码和主码 2 主码 PK 3 主属性和非主属性 4 外键 F
  • Vue 3.0 全家桶 + Vite 从零配置开发环境、生产环境

    上篇文章我们对比了 Vite 与 Webpack 的差异 接下来 准备将项目中用到的 Webpack 5 0 替换为 Vite 2 0 我们先着手从零配置开发 生产环境 文章目录 一 初始化 1 初始化 package json 2 安装
  • CWE-通用弱点枚举简介

    对于软件来说 安全是航空 航天 军工 电力 金融等关键行业极为重视的特性之一 因此 保证软件尽量安全是软件研发人员的重要责任 可以说 软件安全漏洞是软件研发者的一大死敌 古语有云 知彼知己 百战不殆 要想取得战争的胜利 就要尽可能充分认识软
  • SSL 协议分析:ClientHello 过程分析

    最近在分析某个PC端程序的登录过程 发现它用的是openssl进行https通讯的 由于以前没有openssl的使用经验 遂开始学习这个库 在这里记录一些TLS协议的原理 以及openssl实现TLS协议的代码分析 TLS 相当于 SSL
  • iOS编程基础-Swift(二)-函数

    Swift入门指南 iOS9 Programming Fundamentals With swift 第二章 函数 Swift语法中最具特色也最重要的就是声明和调用函数的方式 所有代码都位于函数中 而动作则是由函数触发的 print sum
  • 谓词逻辑中量词的符号化

    在谓词演算中 最基本的命题符号化就三种类型 主语是具体个体对象的 用谓词加括号 括号里是具体个体表示 描述所有的 任意的个体对象 用全称量词 特性谓词做蕴含前件 描述一些客体对象 用存在量词 特性谓词作合取项 注 命题的符号表达式中所有个体
  • Swagger实现登录查看Api

    1 登录页面添加Cookie 工具 js cookie Cookies set token data data token token 复制代码 2 后端添加过滤器 package filter import cn hutool core
  • MCP2515调试笔记(一)

    MSP430 MCP2515调试笔记 一 MCP是MricoChip 公司生产的一款独立CAN控制器 相比恩智浦公司的SJA1000 它的主要特点是与微控制器之间通过SPI方式进行数据交换而不是SJA1000的并行方式 这样可以大大减少引脚
  • 1.GItLab速安装搭建

    安装之前要先准备虚拟机 我得虚拟机ip是192 168 56 10 1 GItLab快速安装搭建 可参考官方安装手册 https about gitlab com install centos 7 下载相关gitlab版本 上传至虚拟机 h
  • Python爬虫入门实战3:获取CSDN个人博客信息

    老猿Python博文目录 https blog csdn net LaoYuanPython article details 98245036 一 引言 在 https blog csdn net LaoYuanPython article
  • C语言小游戏(皇帝和他的后宫)

    小游戏 皇帝和他的后宫 今天我们来玩一个C语言的小游戏 皇帝和他的后宫 所有代码我放在github上了 在文章末尾 这个游戏是仿照着老九学堂的C语言课程写得 这里面运用了二维数组的相关知识 游戏有五个状态 如下图所示 然后我们来说明一下各个
  • 【java基础核心大总结(九)】

    泛型 在 Jdk1 5 中 提出了一种新的概念 泛型 那么什么是泛型呢 泛型其实就是一种参数化的集合 它限制了你添加进集合的类型 泛型的本质就是一种参数化类型 多态也可以看作是泛型的机制 一个类继承了父类 那么就能通过它的父类找到对应的子类