谈谈包装类与泛型

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

目录


包装类


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


装箱和拆箱


装箱


拆箱


泛型


什么是泛型


泛型的语法与使用


泛型的编译


擦除机制


泛型的上界


泛型方法


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


包装类

在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];
    }
}

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

58432d240fcbb63a3733da3142ef0716_6c8e69a9bc6b46fba22a289e8b0d2126.png

那么怎么解决呢?

这就不得不提出泛型了

泛型的语法与使用

class 泛型类名称<类型形参列表> {

// 这里可以使用类型参数

}

a8a79c6df735f2c2200be075ba32df45_db4b53d0747141769ea299884ccd9e12.png

作用:


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的确切类型,因此无法创建泛型数组。


泛型的上界

语法:

5176ea1f0623df63f73970ef9e7e8967_346b961eec354780ba70462353e3fe40.png

实例:

01731417d988bfade0f01b979da406c0_f99ac297531c4e4983c47477485bdeea.png

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


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

72f954e083c2f4a9a6aaafebfa7ebaef_f3699af9e0714dbc86df834c668c2315.png

这里是因为呢,在编译的时候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;
    }
}

泛型方法

语法:

66b81fedc897fd282a6a1e86dadadc24_7ebfc32419f449efbd1d7bfa099ed887.png

示例:

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


目录
相关文章
|
Java
手动将多个Jar包合并成1个Jar包
手动将多个Jar包合并成1个Jar包
371 0
|
数据采集 数据可视化 数据挖掘
数据分析入门:用Python和Numpy探索音乐流行趋势
数据分析入门:用Python和Numpy探索音乐流行趋势
|
自然语言处理 PyTorch 语音技术
Transformers 4.37 中文文档(七十九)(2)
Transformers 4.37 中文文档(七十九)
97 0
|
移动开发 JavaScript 小程序
uView Modal 模态框
uView Modal 模态框
287 0
|
存储 安全 大数据
EasyRecovery2023超强免费的数据恢复软件功能介绍
实用的数据恢复软件有什么?电脑中的数据文件对很多的小伙伴来说都是非常重要的,在下载安装新的软件设备时都需要非常谨慎,一旦碰到一些病毒就可能会导致文件丢失,想要恢复这些文件并不是很容易,需要使用专业的数据恢复工具才可以对其进行恢复,那么有没有什么比较好用的电脑数据恢复软件呢?在面对各种各样的数据恢复软件而不知道怎么选择的时候,为大家简单的介绍了一款好用的数据恢复软件!EasyRecovery下载:http://t.csdn.cn/HHVIM
569 37
|
存储 Java 编译器
【javaSE】 接口和Object类(二)
【javaSE】 接口和Object类(二)
安装WPS
安装WPS
569 0
|
数据采集 前端开发 Java
开始前的准备
开始前的准备 产品理念 在开始之前,我们需要先理清产品的理念,这是指导整个产品走向的关键部分。只有清晰地知道想要打造一个怎样的产品才能很好地落地。这是一个垂直类的搜索引擎,但不仅限于搜索,应该是一个真实有效信息和价格分析的集合。
1504 0
|
算法 C# 计算机视觉
csharp通过dll调用opencv函数,图片作为参数
[blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数          ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找到了比较好的资料。
1463 0