Java泛型和擦除

本文介绍了Java中的泛型概念,包括泛型作为模板的使用方式,如何创建泛型类以及泛型静态方法的定义。同时,解释了泛型的通配符,如上界通配符和下界通配符的用途。此外,讨论了Java泛型的擦拭法,即在运行时泛型会被擦拭成Object类型,导致的一些限制,如不能实例化基本类型,无法获取泛型的Class等。
摘要由CSDN通过智能技术生成

JAVA泛型和擦拭

泛型

1、什么是泛型

泛型可以看作是一个模板,例如:ArrayList<T>,每次用到的时候就创建对应的ArrayList<类型>

// 存储String的ArrayList:
ArrayList<String> strList = new ArrayList<String>();
// 存储Float的ArrayList:
ArrayList<Float> floatList = new ArrayList<Float>();
// 存储自定义类型Person的ArrayList:
ArrayList<Person> personList = new ArrayList<Person>();

注意<>中不能是基本数据类型

2、使用泛型

编写一个泛型

class Bird<T> {
    private T name;
    private T address;
    private T[] elem;  //泛型类型的数组
    public Bird(T name,T address) {
        this.name = name;
        this.address = address;
        this.elem = (T[])new Objects[10];   //创建数组时使用Objects类型,再强转为T[]类型
    }

    public T getName() {
        return name;
    }

    public T getAddress() {
        return address;
    }

    public void setName(T name) {
        this.name = name;
    }

    public void setAddress(T address) {
        this.address = address;
    }
}

注意:定义泛型静态方法时需要在static 后加上<T>

public static<T> Bird<T> mesg(T name,T address){
        return new Bird<>(name,address);
    }

泛型可以定义多种类型,比如我们常用的Map<K,V>就是使用了两种泛型

3、通配符

<T extends 类型>,称为上界通配符,例如:<T extends Number> 表示T的类型,只能是Number的子类或者本身,即NumberT类型的上界。

<T super 类型>表示,方法参数接受所有类型为该类型本身或该类型的父类,例如<T super Integer>,表示方法接受的类型为Integer或者Integer的父类。

擦拭法

擦拭法是指,我们定义的泛型类在执行时会被擦拭成Object类型。即在运行时,泛型类的T会被擦成Object,这就是为什么泛型类可以接收所有数据类型。所以,Java的泛型是由编译器在编译时实行的,编译器内部永远把<T>当作Object处理,但是,在需要转型的时候,编译器就会根据<T>的类型安全地强制转型

擦拭法地局限性

  • <T>不能是基本类型,因为实际类型是ObjectObject类型无法持有基本类型。
  • 无法取得带泛型的class。因为T是Object,我们对Bird<Integer>Bird<String>使用getClass()方法时,返回的是Bird类的class。因为他们编译之后都是Bird<Object>
  • 无法判断带泛型的类型,即不能使用instanceof来判断一个对象是不是泛型类的实例。因为并不存在Bird<Integer>.calss ,只存在Bird.calss
  • 不能实例化T类型,即new T()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值