谈谈包装类与泛型

这篇具有很好参考价值的文章主要介绍了谈谈包装类与泛型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

包装类

基本数据类型与对应的包装类

装箱和拆箱

装箱

拆箱

泛型

什么是泛型

泛型的语法与使用

泛型的编译

擦除机制

泛型的上界

泛型方法


提到泛型的话,我们就先提一下包装类吧!

包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。(注意int和char的包装类不是只大写第一个字母)


基本数据类型与对应的包装类

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

装箱和拆箱

装箱

装箱:把一个基本数据类型 转化为 包装类型的过程

装箱又分为自动装箱和显示装箱,但是都调用了valueof()方法。下面代码可以体现

eg:

    public static void main(String[] args) {
        int a = 10;

        Integer b = a; //自动装箱

        Integer c = Integer.valueOf(a); //显示装箱

    }

拆箱

拆箱:把一个包装类型 转化为 基本数据类型的过程

拆箱也分为自动装箱和显示装箱。下面代码可以体现

eg:

    public static void main(String[] args) {

        Integer a = new Integer(10);

        int b = a; //自动拆箱

        int c = a.intValue(); //显示拆箱

        double d = a.doubleValue();
    }


泛型

什么是泛型

就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化


下面咱看一个问题:
实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?

class MyArray {
    //可以存放任何类型的话 定义一个Object数组
    public Object[] array = new Object[10];

    //pos放入的位置 val存放的数据
    public void set(int pos, Object val) {
        array[pos] = val;
    }

    //获取数据
    public Object get(int pos) {
        return array[pos];
    }

}

但是这样写的话需要强转类型

谈谈包装类与泛型

 那么怎么解决呢?

这就不得不提出泛型了


泛型的语法与使用

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

谈谈包装类与泛型


 作用:

1. 泛型是将数据类型参数化,进行传递

2. 使用 <T> 表示当前类是一个泛型类。

3. 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

这样(代码体现)就能解决上面的问题了(可以不用强制类型转换)

class MyArray<T> {
    //可以存放任何类型的话 定义一个Object数组
    public Object[] array = new Object[10];

    //pos放入的位置 val存放的数据
    public void set(int pos, T val) {
        array[pos] = val;
    }

    //获取数据
    public T get(int pos) {
        return (T)array[pos];
    }

}


//测试类中的main方法
public static void main(String[] args) {
    //<>里面只能放包装类型
    MyArray<String> myArray1 = new MyArray<>();
        
    MyArray<Integer> myArray2 = new MyArray<>();
        
}

注意:不能new一个泛型类的数组 但是可以下面这样写(不推荐)

class MyArray<T> {

    public T[] array2 = new T[10]; //不能直接new(下面会解释)

    public T[] array3 = (T[]) new Object[10];//不建议
    
}


泛型的编译

擦除机制

通过命令:javap -c 查看字节码文件,所有的T都是Object。在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息


提出问题:
1.那为什么,T[] ts = new T[5]; 是不对的,编译的时候,替换为Object,不是相当于:Object[] ts = new Object[5]吗?

这是因为在Java中,泛型类型擦除机制会将T转换为Object,并且不支持创建泛型数组。

public class GenericArray<T> {
    private T[] array;

    public GenericArray(int size) {
        this.array = new T[size]; // 编译错误
    }
}

上述代码中,在使用new关键字创建GenericArray实例时,我们尝试创建一个大小为size的泛型数组。但是,由于类型擦除机制,编译器无法了解T的确切类型,因此无法创建泛型数组。


泛型的上界

语法:

谈谈包装类与泛型

 实例:

谈谈包装类与泛型

 这里的传入的类型形参(E)必须是边界(Number)的子类

求一个数组中的最大值想必大家都不陌生吧,那么大家看看下面的代码,为什么报错呢?

谈谈包装类与泛型

 这里是因为呢,在编译的时候T会被替换成Object,但是在Object类中没有没有实现比较的接口,因为它是引用类型,必须 . 一个比较的方法,也得让T实现比较的接口。代码如下:

//这里extends是扩展的意思 不是继承的意思
class Alg<T extends Comparable<T>> {

    public T findMax(T[] array) {
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(array[i].compareTo(max) > 0) {
                max = array[i];
            }
        }
        return max;
    }

}

泛型方法

语法:

谈谈包装类与泛型

示例:文章来源地址https://www.toymoban.com/news/detail-458350.html

    //泛型方法 返回值为T类型
    public static <T> T swap() {
        
    }

到了这里,关于谈谈包装类与泛型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基本数据类型和包装类型 使用规范

    自动装箱(Autoboxing)和拆箱(Unboxing)是Java中用于在基本数据类型和其对应的包装类型之间进行转换的机制。这两种机制的目的是使代码更简洁和易读,同时提供类型安全性。 1、自动装箱:将基本数据类型的值自动封装成相应的包装类型对象。例如,将 int 转换为 Integer,将

    2024年02月09日
    浏览(45)
  • JAVA包装类和基本数据类型------JAVA入门基础教程

    public class WrapperTest {     public static void main(String[] args)     {         int i1 = 10;         Integer i11 = new Integer(i1);         System.out.println(i11);         float f1 = 12.3F;         f1 = 32.2F;         Float ff1 = new Float(f1);         System.out.println(ff1);         String s1 = \\\"32.1\\\";         F

    2024年02月02日
    浏览(43)
  • == 和 equles()基于字符串、基本数据类型、包装类应用的不同和原理

    对于 == 和 equals() 大家都很熟悉,大多也知道结论,但是运用的时候,有时候根据结论来,完全是摸不着头脑,所以我在这系统的简述一下关于两者在基本数据类型、字符串类型、包装类这三个应用上的区别。 下面我主要是说 == 的运用,因为equals()对于字符串就是比较内容,

    2024年03月19日
    浏览(67)
  • kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口

    kotlin与java语言一样,编译成字节码后,在JVM虚拟机中运行。kotlin语言的特性依赖于kotlin的语法编译器。与kotlin类似的语言还有: Scala:大数据领域开发语言 Groovy:基于 JVM 平台的动态脚本语言, 在安卓开发中用来编写依赖关系、插件等 2019年谷歌宣布Kotlin成为安卓第一开发语

    2024年02月09日
    浏览(48)
  • 【数据结构】复杂度&包装&泛型

    目录 1.时间和空间复杂度 1.1时间复杂度 1.2空间复杂度 2.包装类 2.1基本数据类型和对应的包装类 2.2装箱和拆箱 //阿里巴巴面试题 3.泛型 3.1擦除机制  3.2泛型的上界 定义 :一个算法所花费的时间与其语句的执行次数成正比,算法中的基本操作的 执行次数 ,为算法的时间复杂

    2024年02月03日
    浏览(40)
  • 第五章 基本引用类型(下)——原始值包装类型、

    5.3 原始值包装类型         为了方便操作原始值,ECMAScript提供了3种特殊的引用类型:Boolean、Number和String。这些类型具有本章介绍的其他引用类型一样的特点,但也具有与各自原始类型对应的特殊行为。每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包

    2024年01月16日
    浏览(44)
  • 数据结构(Java实现)-包装类和泛型

    包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。 基本数据类型和对应的包装类 装箱和拆箱 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中 拆箱操作,将 Integer 对象中

    2024年02月11日
    浏览(41)
  • 第十三章,枚举与泛型例题

    例题1 结果   例题2 结果   例题3 结果     例题4 结果 例题5  结果 例题6  结果 例题7  结果 例题8  结果

    2024年02月06日
    浏览(48)
  • C++——模板初阶与泛型编程

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月17日
    浏览(38)
  • Java 中有了基本类型为什么还需要包装类?

    Java 中有8种基本数据类型,这些基本类型又都有对应的包装类。 分类 基本数据类型 包装类 布尔型 boolean Boolean 整型 byte Byte short Short int Integer long Long 字符型 char Character 浮点型 float Float double Double 因为 Java 是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包