Java泛型

文章目录

  • 1. 泛型入门
    • 1.1 定义简单泛型类
    • 1.2 泛型方法
    • 1.3 限定类型变量
  • 2. 擦除和转换
    • 2.1 类型擦除
  • 3. 类型通配符
    • 3.1 通配符上限
    • 3.2 通配符下限
    • 3.3 例子
  • 4. java的Type
    • 4.1 UML总览

1. 泛型入门

泛型的英文名Generic,java5以后,引入参数化类型(parameterized type)概念,允许在创建集合时指定集合元素的类型。Java 的 参 数 化 类 型 被 称 为 泛 型(Generic)。

代码示例:

 public static void main(String[] args) {// 指定类型为StringList<String> list = new ArrayList<>();list.add("dsf");// 类型不符,报错list.add(1);}

1.1 定义简单泛型类

public class Pair<T> {private T first;private T second;public Pair() {}public Pair(T min, T max) {this.first = min;this.second = max;}public T getFirst() {return first;}public void setFirst(T first) {this.first = first;}public T getSecond() {return second;}public void setSecond(T second) {this.second = second;}
}

类型变量T用<>括起来,使用大写形式。在java中,使用E表示集合中的元素,K和V表示键和值,T(U,S)表示任意类型。

使用示例:

public class ArrayAlg {public static Pair<String> minmax(String[] arr) {if (arr == null || arr.length == 0) {return null;}String min = arr[0];String max = arr[0];for (int i = 0, length = arr.length; i < length; i++) {if (min.compareTo(arr[i]) > 0) {min = arr[i];}if (max.compareTo(arr[i]) < 0) {max = arr[i];}}return new Pair<>(min, max);}}

1.2 泛型方法

   public static <T> T getMiddle(T... arr) {return arr[arr.length / 2];}

使用示例:

    public static void main(String[] args) {String sdaf = ArrayAlg.getMiddle("123", "sdaf");}

1.3 限定类型变量

public static <T extends Comparable> T min(T[] arr) {if (arr == null || arr.length == 0) {return null;}T min = arr[0];for (int i = 0; i < arr.length; i++) {if (min.compareTo(arr[i]) > 0) {min = arr[i];}}return min;}

限定T是Comparable或Comparable的子类。

2. 擦除和转换

虚拟机没有泛型类型对象,所有对象都是普通类。

2.1 类型擦除

  • 如果类型变量没有限定,那么会用原始Object替换T。
    上文的Pair类的T没有指定上限。
public static void main(String[] args) {// 限定String类型Pair<String> pair = new Pair<String>("2134","sfsdf");String first = pair.getFirst();// pair2没有指定类型,first1只能知道是ObjectPair pair2 = pair;Object first1 = pair2.getFirst();// 编译报错String first2 = pair2.getFirst();}

在这里插入图片描述

  • 如果类型变量有限定,那么会用上限t替换T。
public class Apple<T extends Number> {T size;public Apple(T size) {this.size = size;}public T getSize() {return size;}public void setSize(T size) {this.size = size;}
}
public static void main(String[] args) {Apple<Integer> apple = new Apple<>(6);// 这里返回Integer对象Integer size = apple.getSize();// apple2丢失尖括号的类型信息,apple2只能知道Number类型Apple apple2 = apple;Number size1 = apple2.getSize();// 编译报错Integer size2 = apple2.getSize();}

在这里插入图片描述

  • 步骤
    Java编译器编译泛型的步骤:
    1.检查泛型的类型 ,获得目标类型
    2.擦除类型变量,并替换为限定类型(T为无限定的类型变量,用Object替换)
    3.调用相关函数,并将结果强制转换为目标类型。
public static void main(String[] args) {ArrayList<String> arrayString = new ArrayList<String>();ArrayList<Integer> arrayInteger = new ArrayList<Integer>();System.out.println(arrayString.getClass() == arrayInteger.getClass());}

运行结果为true。getClass()总是返回原始类型。

3. 类型通配符

类型通配符: ?,代表任意类型。

3.1 通配符上限

<? extends T>, 意思是需要一个T类型或者T类型的子类。 适用于消费集合元素为主的场景。

public class Animal {
}

Cat继承Animal 。

public class Cat extends Animal {}
  public static void handle(List<? extends Animal> list) {for (Animal animal : list) {System.out.println(animal);}// 编译报错,不能添加元素list.add(new Animal());list.add(new Cat());}

在这里插入图片描述

3.2 通配符下限

<? super T>,意思是需要一个T类型或者T类型的父类。适用于生产元素为主的场景。

 public static void handle2(List<? super Cat> list) {// 只能是Objectfor (Object cat : list) {System.out.println(cat);}// 编译报错for (Cat cat : list) {System.out.println(cat);}list.add(new Cat());}

在这里插入图片描述

3.3 例子

 public static void main(String[] args) {// 1.继承关系:Object > Animal > Cat > WhiteCatList<Animal> animals = new ArrayList<>();List<Cat> cats = new ArrayList<>();List<WhiteCat> whiteCats = new ArrayList<>();animals.add(new Animal());cats.add(new Cat());whiteCats.add(new WhiteCat());// 2.测试赋值操作// 下一行报错,只能赋值给Cat或Cat之类List<? extends Cat> extendsCatFromAnimal = animals;List<? super Cat> superCatFromAnimal = animals;List<? extends Cat> extendsCatFromCat = cats;List<? super Cat> superCatFromCat = cats;List<? extends Cat> extendsCatFromWhiteCat = whiteCats;// 报错,只能赋值给Cat或Cat的父类List<? super Cat> superCatFromWhiteCat = whiteCats;// 3.测试add方法// 均报错,无法addextendsCatFromCat.add(new Animal());extendsCatFromCat.add(new Cat());extendsCatFromCat.add(new WhiteCat());// 下一行报错,只能添加Cat或Cat的子类superCatFromCat.add(new Animal());superCatFromCat.add(new Cat());superCatFromCat.add(new WhiteCat());// 4.测试get方法// 所有super操作都能够返回元素,不过泛型丢失,只能是Object类型Object object = superCatFromAnimal.get(0);Object object2 = superCatFromCat.get(0);Object object3 = superCatFromWhiteCat.get(0);// 均可以返回Cat cat = extendsCatFromAnimal.get(0);Cat cat1 = extendsCatFromCat.get(0);// 报错,虽然WhiteCat继承Cat,但类型擦除之后是不知道的WhiteCat cat2 = extendsCatFromWhiteCat.get(0);}

在这里插入图片描述

4. java的Type

4.1 UML总览

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原型模式——对象的克隆

1、简介 1.1、概述 可以通过一个原型对象克隆出多个一模一样的对象&#xff0c;该模式被称为原型模式。 在使用原型模式时&#xff0c;需要首先创建一个原型对象&#xff0c;再通过复制这个原型对象来创建更多同类型的对象。 1.2、定义 原型模式&#xff08;Prototype Patt…

14.python设计模式【模板方法模式】

内容&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法某特定步骤。 角色&#xff1a; 抽象类&#xff08;AbstractClass&#xff09;&#xff1a;定义抽象的原子操作&#xff08;钩子…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v9.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、标准Java平台&#xff0c;服务端基于Netty编写。 工程开源地址是&am…

HTML5前端开发工程师的岗位职责说明(合集)

HTML5前端开发工程师的岗位职责说明1 职责 1、根据产品设计文档和视觉文件&#xff0c;利用HTML5相关技术开发移动平台的web前端页面; 2、基于HTML5.0标准进行页面制作&#xff0c;编写可复用的用户界面组件; 3、持续的优化前端体验和页面响应速度&#xff0c;并保证兼容性和…

Flask 进阶

Flask 如何访问项目以外的文件 在工作中&#xff0c; 要在项目里展示一些额外的文件&#xff0c; 包括但不限于静态的html。图片&#xff0c; log&#xff0c; 其他的都还好说&#xff0c; 但是当html的时候我就开始犯难了&#xff0c; 因为数量过多 我并不想把它塞进我项目的t…

【论文阅读】Feature Inference Attack on Shapley Values

摘要 研究背景 近年来&#xff0c;解释性机器学习逐渐成为一个热门的研究领域。解释性机器学习可以帮助我们理解机器学习模型是如何进行预测的&#xff0c;它可以提高模型的可信度和可解释性。Shapley值是一种解释机器学习模型预测结果的方法&#xff0c;它可以计算每个特征对…

了解Unity编辑器之组件篇Scripts(六)

Scripts&#xff1a;有Unity提供的一些脚本插件&#xff08;自己新建的脚本也会出现在里面&#xff09; 一、TMPro&#xff1a;有一些与文字显示和排版相关的脚本 1.TextContainer&#xff08;文本容器&#xff09;&#xff1a;TextContainer 是一个内容框&#xff0c;用于定…

Vue.js学习和常用知识(一)

目录 一、基本概念1.1 Vue.js 简介1.2 Vue.js 的特点1.3 Vue.js 的应用场景 二、组件2.1 组件是什么&#xff1f;2.2 组件的语法是什么&#xff1f;2.3 组件的生命周期是什么&#xff1f;2.4 组件的数据传递是什么&#xff1f; 三、指令3.1 指令是什么&#xff1f;3.2 指令的语…

AIGC人工智能辅助开发:提升效率、优化代码、实现智能编程

文章目录 1. 什么是AIGC人工智能辅助开发&#xff1f;2. AIGC的优势和应用场景2.1 提升开发效率2.2 优化代码质量2.3 实现智能编程 3. 如何用好AIGC人工智能辅助开发&#xff1f;3.1 选择合适的AIGC工具3.2 理解AIGC的工作原理3.3 逐步应用AIGC辅助开发3.4 主动参与AIGC的学习和…

adb no permissions (user *** is not in the plugdev group)

首次配置ubuntu下的adb 环境&#xff0c;执行了adb device命令会出现以下问题 lvilvi-PC:~/develop/android/sdk/platform-tools$ adb devices List of devices attached 123699aac6536d65 no permissions (user lvi is not in the plugdev group); see [http://develo…

AI工程师的崛起:填补AI革命中的空白

在一个拥有大约5000名语言学习模型&#xff08;LLM&#xff09;研究员&#xff0c;但大约有5000万软件工程师的世界中&#xff0c;供应限制决定了一种新型专业人才—AI工程师的迅猛增长。他们的崛起不仅仅是一种预测&#xff0c;更是对科技世界动态变化的必然反应。AI工程师作为…

【Linux】-进程概念及初始fork

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

在CSDN学Golang云原生(Kubernetes Volume)

一&#xff0c;Volume 与 configMap Kubernetes 中的 Volume 和 ConfigMap 都是 Kubernetes 中常用的资源对象。它们可以为容器提供持久化存储和配置文件等。 Volume 可以将容器内部的文件系统挂载到宿主机上&#xff0c;也可以将多个容器间共享一个 Volume&#xff0c;并且 …

代码随想录算法训练营day42

文章目录 Day42分割等和子集题目思路代码 划分为k个相等的子集题目思路代码 Day42 分割等和子集 416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 题目 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等…

使用Gradio构建生成式AI应用程序; Stability AI推出Stable Diffusion XL 1.0

&#x1f989; AI新闻 &#x1f680; Stability AI推出最先进的AI工具Stable Diffusion XL 1.0 摘要&#xff1a;Stability AI宣布推出Stable Diffusion XL 1.0&#xff0c;该版本是其迄今为止最先进的AI工具。Stable Diffusion XL 1.0提供更鲜艳、更准确的图片生成&#xff…

Python开发之手动实现一维线性插值

Python开发之手动实现一维线性插值 1.线性插值法介绍2.手动实现线性插值3.案例一&#xff1a;手动实现线性插值4.使用pandas的插值方法实现要求(推荐)5.案例二&#xff1a;对一组数据进行线性插值和SG滤波处理 前言&#xff1a;主要介绍手动实现一维线性插值以及pandas里面的in…

flink采用thrift读取tablets一个天坑

原先的配置 [INFO] StarRocksSourceBeReader [open Scan params.mem_limit 8589934592 B] [INFO] StarRocksSourceBeReader [open Scan params.query-timeout-s 600 s] [INFO] StarRocksSourceBeReader [open Scan params.keep-alive-min 100 min] [INFO] StarRocksSourceBeRea…

ORCA优化器浅析——QueryToDXL(CDXLLogical+CDXLScalar)主流程

Orca是Pivotal数据管理产品的新查询优化器&#xff0c;包括GPDB和HAWQ。Orca是一个基于Cascades操作时序框架的现代自上而下的查询优化器。虽然许多Cascades优化器与其主机系统紧密耦合&#xff0c;但Orca的一个独特功能是它能够作为独立的优化器在数据库系统之外运行。这种能力…

51:电机(ULN2003D)

1:介绍 我们51单片机使用的是直流电机 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转…

flutter:角标

角标应该非常常见了&#xff0c;以小说app为例&#xff0c;通常会在小说封面的右上角上显示当前未读的章数。 badges 简介 Flutter的badges库是一个用于创建徽章组件的开源库。它提供了简单易用的API&#xff0c;使开发者可以轻松地在Flutter应用程序中添加徽章效果。 官方文…