Java —— 初始泛型

Java —— 初始泛型

在这里插入图片描述

每博一文案

人生就像一趟永不停歇的列车,在岁月长河中不断穿行。
小时候总希望自己快点长大,觉得成年人的世界会很幸福,可当我们长大
后,才发现没有什么是一成不变的。不飞,人也飞,我们走着走着,明白了
没有谁会停留在原地,一直如初,也许,一不小心就会弄丢了对方。
就像席慕容在小红门中写道,这个世界上有很多人,你以为明天一定可以见面,
所以你暂时放下手,但求那么一次,你一转身,有些人就此和你有绝了。
人生路上有些人,注定只能陪我们一程,不管我们是否愿意,转身的刹那,很有可能
就是后悔无期。
                                       ————————     一禅心灵庙语



泛型

数组有一个非常经典的特点,即数组声明后只能存放同一种类型的数据。集合存放元素多元化。可以存放不同的类型的数据,因为集合底层每个元素都会向上转型为 Odject 类型,Odject 类是所有类的父类,任意的类型都可以存入到集合中,集合在设计之初并不确定实际要存储什么类型的对象,所以底层元素了类型设计为Odject 类,集合中可以存入多种数据类型的元素,只有当需要存储相同类型的个体时才会选择使用集合,所以在JDK1.5 以后,使用泛型来解决限制。通过使用泛型,去除了元素类型存入的不确定性,在创建集合之初就约定了这个集合可以存放类型。

泛型类的定义

  • 尖括号< > 是泛型的标志,<E> 是类型变量(Type Variable), 变量名一般要大写,E 在定义时是形参,代表的意思是 ,最终传入的类型
  • 泛型的分类
    • 泛型类
    • 泛型方法

泛型

<T> :只是一个占位符,表示当前类是一个泛型类

  1. 泛型可以自动进行类型的检查,
  2. 泛型可以进行类型的转换

泛型的坑

  1. new 泛型类型的数组。 this.elem = new new[10]
  2. 基本数据类型不可以作为泛型的参数使用,需要使用对应的包装类 MyArrayList myArrayList = new MyArrayList<>();
  3. 泛型类型参数,不参与类型的组成

package Blog1;
// 泛型

import java.util.Arrays;

// 创建一个泛型类
class MyArrayList<T>{
    public T[] elem;  // 创建一个泛型数组
    public int usedSize;

    public MyArrayList() {    // 构造方法
//        this.elem = new new[10];  // 泛型不可实例化
        this.elem = (T[])new Object[10];  // Object父类数组 通过强转置为 泛型数组

    }

    public void add(T val) {  // 泛型参数
        this.elem[this.usedSize] = val;
        this.usedSize++;
    }

    public T[] getElem() {
        return elem;
    }
    public T getVal(int n) {  // 根据下标返回对应数组的下标值
        return elem[n];
    }
}

public class Blog16 {
    public static void main(String[] args) {
//        MyArrayList<int> myArrayList = new MyArrayList<>();
//        基本数据类型不可以作为泛型的参数使用,需要使用对应的包装类才行
        MyArrayList<Integer> myArrayList = new MyArrayList<Integer>();  // 等号右边的参数可以省略不写的
        myArrayList.add(1);
//        myArrayList.add("hello");   泛型会自动检查类型的一致性
        myArrayList.add(2);
        myArrayList.add(3);
        System.out.println(myArrayList.getVal(1));  // 取对应下标的值
        System.out.println(Arrays.toString(myArrayList.getElem()));  // 打印泛型数组
    }

}

在这里插入图片描述


通过以上代码,我们可以看到泛型类的一个使用方法,只需要在所存类型后边跟上 尖括号<> ,并且尖括号内是真正的类型,即 T 可以看作是最后的类型。

面试问题

泛型到底是怎么编译的

面试官想知道的就是4个字 擦除机制

泛型只是编译时期的一种机制 ,异常也是 —— 擦除机制

擦除机制 : 在运行的时候,不存在泛型的说法,所有的处理均在编译阶段已经处理。擦除机制,在编译的时候,泛型类型被擦除为了 Object 使用,注意 不是替换,而是擦除


泛型总结

  1. 泛型是为了解决某些容器,算法等代码的通用性而引入,并且能在编译间做类型检查
  2. 泛型利用的是Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作
  3. 泛型是一种编译期间的机制,即MyArrayList<Person>、MyArrayList<String> 在运行期间是一个类型
  4. 泛型是 Java中的一种合法语法标志就是 尖括号< >

最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值