Java之初始泛型

news2024/11/24 1:06:27

1 包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。

1.1 基本数据类型和对应的包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

1.2 装箱和拆箱

public static void main(String[] args) {
        int i1=10;
        Integer i2=i1;//自动装箱
        Integer i3 = Integer.valueOf(i1);//主动装箱

        Integer j1=10;
        int j2=j1;//自动拆箱
        int j3=j1.intValue();//主动拆箱
    }

可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制。
我们通过反汇编来了解一下自动装箱和自动拆箱
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
了解了装箱和拆箱,我们来通过一段代码来深度了解一下:

public static void main(String[] args) {
 Integer a = 127;
 Integer b = 127;
 Integer c = 128;
 Integer d = 128;
 System.out.println(a == b);
 System.out.println(c == d);
 }

在这里插入图片描述
为了解决这个问题,我们从Integer的底层代码来思考
在这里插入图片描述
得出结论:
在区间[-128,127)内直接比较两数大小,
在区间外产生了新的对象,比较的产生新对象的地址。

2 什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。

泛型是在 JDK1.5 引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

3 引出泛型

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?
我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new String[10];
所有类的父类,默认为Object类。数组是否可以创建为Object?

class MyArray {
    public Object[] objects=new Object[10];
    public void setObjects(int pos,Object val){
        this.objects[pos]=val;
    }
    public Object getPosval(int pos){
        return this.objects[pos];
    }
}
public class TestGenerics {

    public static void main(String[] args) {
        MyArray myArray=new MyArray();
        myArray.setObjects(0,1);
        myArray.setObjects(1,3.14);
        myArray.setObjects(2,"xiaoming");
        myArray.setObjects(3,"true");
        System.out.println(myArray.getPosval(0));
        System.out.println(myArray.getPosval(1));
        String s=(String) myArray.getPosval(2);
        System.out.println(s);  
        //虽然可以存放任何类型数据 ,但是在取出时必须强制转换,非常的麻烦
    }
}

在这里插入图片描述

我们发现使用Object修饰的数组确实可以存放不同类型的数据,但是引发了一个新的问题
虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,
我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

3.1 语法

class 泛型类名称<类型形参列表> {
    // 这里可以使用类型参数
}

class ClassName<T1, T2, ..., Tn> {  
}

对上述代码进行改写如下:

class MyArray<T>{类名后的<T>代表占位符,表示当前类是一个泛型类
    public Object[] objects=new Object[10];
    public void setVal(int pos,T val){
        this.objects[pos]=val;
    }
    public T getPosval(int pos){
        return (T)this.objects[pos];
    }
}
public class TestGenerics {
    public static void main(String[] args) {
        MyArray<Integer> myArray1=new MyArray();
        myArray1.setVal(0,1);
        myArray1.setVal(1,2);
        MyArray<Double> myArray2=new MyArray<>();
        myArray2.setVal(0,3.14);
        MyArray<String> myArray3=new MyArray<>();
        myArray3.setVal(0,"xiaoming");
        System.out.println(myArray1.getPosval(0));
        System.out.println(myArray1.getPosval(1));
        System.out.println(myArray2.getPosval(0));
        System.out.println(myArray3.getPosval(0));
    }
    }

在这里插入图片描述

4 泛型类的使用

4.1 语法

泛型类<类型实参> 变量名;  // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参);  // 实例化一个泛型类对象

4.2 示例

MyArray<Integer> list = new MyArray<Integer>();

注意:泛型只能接受类,所有的基本数据类型必须使用包装类!

4.3 类型推导(Type Inference)

当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写

MyArray<Integer> list = new MyArray<>(); // 可以推导出实例化需要的类型实参为 Integer

5. 裸类型(Raw Type)

5.1 说明

裸类型是一个泛型类但没有带着类型实参,例如 MyArrayList 就是一个裸类型

MyArray list = new MyArray();

注意: 我们不要自己去使用裸类型,裸类型是为了兼容老版本的 API 保留的机制
下面的类型擦除部分,我们也会讲到编译器是如何使用裸类型的。

6 泛型如何编译的

6.1 擦除机制

那么,泛型到底是怎么编译的?这个问题,也是曾经的一个面试问题。泛型本质是一个非常难的语法,要理解好他还是需要一定的时间打磨。
在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。
Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。

7 泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

7.1 语法

class 泛型类名称<类型形参 extends 类型边界> {
    ...
}

7.2 示例

class Alg<T extends Comparable<T> >{

}

例如:找到数组中的最大值的代码如下

class Alg1<T extends Comparable<T> >{
   public T finMax(T[] array){
       T max = array[0];
       for (int i = 0; i <array.length ; i++) {
           //if(max<array[i]){//泛型类不能直接通过> < ==来比较
           if(max.compareTo(array[i])<0) {
               max=array[i];
           }
       }
       return max;
   }
}

public class TestGenerics {
    public static void main(String[] args) {
        Alg1 alg=new Alg1();
        Integer[] array = {1,2,3,14,5};
        System.out.println(alg.finMax(array));
    }
}

8 泛型方法

8.1 定义语法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }

8.2 示例

//泛型方法
class Alg2{
    public<T extends Comparable> T finMax(T[] array){
        T max = array[0];
        for (int i = 0; i <array.length ; i++) {
            //if(max<array[i]){
            if(max.compareTo(array[i])<0) {
                max=array[i];
            }
        }
        return max;
    }
}
//泛型方法
// //静态的泛型方法 需要在static后用<>声明泛型类型参数
class Alg3{
    public static <T extends Comparable> T finMax(T[] array){
        T max = array[0];
        for (int i = 0; i <array.length ; i++) {
            //if(max<array[i]){
            if(max.compareTo(array[i])<0) {
                max=array[i];
            }
        }
        return max;
    }
}

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

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

相关文章

RAG最佳实践:用 ElasticSearch 打造AI搜索系统与RAG 应用全流程详解!

前面一篇文章《RAG 向量数据库:掌握 Elasticsearch 作为向量数据库的终极指南》中,介绍了使用ElasticSerach作为向量数据的安装和使用指南。 今天这篇文章将介绍如何使用 Elasticsearch 搭建AI搜索系统和RAG应用系统。 Elasticsearch 搭建 AI 搜索系统 在 Elasticsearch 中…

游泳耳机哪个牌子的好?四大口碑精品游泳耳机专业推荐!

在追求健康生活的同时&#xff0c;游泳成为了许多人选择的锻炼方式。它不仅能够帮助人们塑造身材&#xff0c;还能有效缓解压力。而在游泳过程中&#xff0c;音乐的陪伴无疑能让人更加享受这段时光。因此&#xff0c;一款适合游泳时使用的耳机&#xff0c;成为了游泳爱好者们不…

java程序CUP持续飙高

1.top 2.定位进程中使用CPU最高的线程 top -Hp 70688 3.将线程ID转为十六进制 printf "0x%x\n" 28760 4.jstack工具跟踪堆栈定位代码 jstack 70688 | grep 0x7058 -A 10

尺度和位置敏感的红外小目标检测

Infrared Small Target Detection with Scale and Location Sensitivity 在本文中&#xff0c;着重于以更有效的损失和更简单的模型结构来提升检测性能。 问题一 红外小目标检测&#xff08;IRSTD&#xff09;一直由基于深度学习的方法主导。然而&#xff0c;这些方法主要集中…

python-春游

[题目描述] 老师带领同学们春游。已知班上有 N 位同学&#xff0c;每位同学有从 0 到 N−1 的唯一编号。到了集合时间&#xff0c;老师确认是否所有同学都到达了集合地点&#xff0c;就让同学们报出自己的编号。到达的同学都会报出自己的编号&#xff0c;不会报出别人的编号&am…

单链表应用

基于单链表实现通讯录项目 //Contact.c #define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" #include"list.h"//初始化通讯录 void InitContact(contact** con) {con NULL;} //添加通讯录数据 void AddContact(contact** con) {PeoInfo info;printf…

无主灯设计:吊顶之问与光影艺术的探索

在现代家居设计中&#xff0c;照明不仅仅是为了满足基本的照明需求&#xff0c;更是一种艺术和情感的表达。随着无主灯设计越来越受到人们的青睐&#xff0c;许多业主开始考虑一个问题&#xff1a;进行无主灯设计时&#xff0c;是否一定需要吊顶呢&#xff1f;本文将深入探讨这…

2017年系统架构师案例分析试题五

目录 案例 【题目】 【问题 1】(5 分) 【问题 2】(16 分) 【问题 3】(4 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】答案 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某电子商务企业因发…

小波神经网络的时间序列的短时交通流量预测

小波神经网络的时间序列的短时交通流量预测 通过小波分析进行负荷序列分 解, 获得不同频率负荷分量规律 ; 由粒子群算法进行粒子群适应度排序 , 提升算法收敛速度和收敛能力 ; 为避免算法陷入局部 收敛性, 引入混沌理论来增强全局搜索能力 。 预测结果

linux 系统如何进行nfs(第五节)

网上的截图&#xff1a; 自己的操作&#xff1a; 首先是 在虚拟机中的操作。 然后是在开发板上的操作。 已经是没有问题了。

AI绘画【Stable Diffusion】抽卡必备!时间管理大师Agent Scheduler插件,一键设置任务,让你的休息时间充分利用起来!

大家好&#xff0c;我是灵魂画师向阳 相信大家在玩 Stable Diffusion 的时候一直有一个痛点&#xff0c;每次出图抽卡时都只能等待上一次抽卡结束&#xff0c;才能继续下一次抽卡&#xff1b; 特别是当我们想抽大量的卡来测试不同的模型&#xff0c;不同的参数的效果时&#…

大学生社团管理系统

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《大学生社团管理系统》。 随着校园文化的不断丰富&#xff0c;大学里各种社团越来越多&#xff0c;社团活动也越来越频繁&#xff0c;社团管理就显得繁琐&#xff0c;传统的人工管理方式比较麻烦&#xff0c;…

Client客户端模块

一.Client模块介绍 二.Client具体实现 1.消费者/订阅者模块 2.信道管理模块 3.异步线程模块 4.连接管理模块 这个模块同样是针对muduo库客户端连接的二次封装&#xff0c;向用户提供创建channel信道的接口&#xff0c;创建信道后&#xff0c;可以通过信道来获取指定服务。 三…

游泳耳机哪个牌子好?四大硬核爆款游泳耳机推荐种草!

随着人们对健康生活方式的不断追求&#xff0c;游泳作为一项全身性的运动受到了越来越多人的喜爱。与此同时&#xff0c;为了在水下也能享受音乐的乐趣&#xff0c;游泳耳机应运而生&#xff0c;并迅速成为泳池和海滩上不可或缺的装备之一。面对市面上琳琅满目的游泳耳机产品&a…

线性表之静态链表

1. 静态链表的设计 1.1 定义静态链表 链表是由多个相同类型的节点组成的线性表&#xff0c;它的每个节点都包含一个数据项和一个指向下一个节点的指针&#xff0c;链表中各个节点的地址是不连续的。 下面是一个用于存储整形数据的链表节点结构&#xff1a; struct Node {int…

深度学习与大模型第1课环境搭建

深度学习与大模型第1课 环境搭建 1. 安装 Anaconda 首先&#xff0c;您需要安装 Anaconda&#xff0c;这是一个开源的 Python 发行版&#xff0c;能够简化包管理和环境管理。以下是下载链接及提取码&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Na2xOFpBXQMgzXA…

Text Control 控件教程:智能文档处理 (IDP)

TX Text Control 是一款功能类似于 MS Word 的文字处理控件&#xff0c;包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理&#xff0c;网站内容发布&#xff0c;电子病历中病案模板创建、病历书写、修改历史、连续打…

【云计算】什么是云计算服务|为什么出现了云计算|云计算的服务模式

文章目录 什么是云计算服务本地部署VS云计算SaaS PaaS IaaS公有云、私有云、混合云为什么优先发展云计算服务的厂商是亚马逊、阿里巴巴等公司 什么是云计算服务 根据不同的目标用户&#xff0c;云计算服务&#xff08;Cloud Computing Services&#xff09;分为两种&#xff1…

前端性能优化:提升网站加载速度的五个关键技巧

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介前端性能优化&#xff1a;提升网站加载速度的五个关键技巧1. 引言2. 前端性能优化的五个关键技巧2.1 减少HTTP请求技巧说明实现示例 2.2 启用浏览器缓存技巧说明实现示例 2.3 使用内容分发网络&#xff08;CDN&#xff09;技巧说明…