初识泛型(1)

在定义一个类的时候,通常我们会指定顺序表中要保存数据的类型,这需要我们在编写的时候就需要想好这个类里面会放入什么类型的数据,限制了代码的灵活性。

有没有什么办法,让我们可以在编写代码时灵活的向类中放入想要的数据类型,而不需要提前想好这个类需要放入什么样的数据类型。

如定义一个顺序表:

public class MyArrayList{
    private Object[] array;
    private int size;
    
    public void add(Object val){};//尾插
    public Object get(int index){};
}

在使用的时候,因为array数组中每个元素的类型都是Object,所以在向顺序表中传入任何类型参数的时候,参数都会强制类型转换为Object类型,而Object是所有类的父类,根据多态,Objdect可以保存所有的数据类型,提高了使用的灵活性。

MyArrayList dogs = new MyArrayList();
for (int i = 0; i < 10; i++) {
dogs.add(new Dog()); //增加10只狗到顺序表
}
MyArrayList cats = new MyArrayList();
for (int i = 0; i < 10; i++) {
cats.add(new Cat()); //增加10只猫到顺序表
}

但是,虽然向array数组中放入数据比较灵活,可是存放数据时没有类型检查,什么类型的数据都可以放进去,并且取出数据时需要手动进行强制类型转换。如:

Cat cat = (Cat)cats.get(0);

虽然使用Object类型保存数据比较灵活,可是因为array数组中所有的元素都被强制转换成了Object类型,所以取出数据时依然要将数据进行强制类型转换才能使用,虽然编译可以通过,但如果一开始存入的数据类型与想取出的数据类型不符,运行时会抛出异常。

这给程序的使用者带来了风险,为了解决这一的风险所以需要一种机制:

1.增加编译期间的类型检查。
2.取消手动类型转换的使用。

这种机制就是泛型

泛型语法

泛型类

class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> {
}

1.尖括号 <> 是泛型的标志
2.泛型可以把类型参数化,将类型作为参数传入。
3.<>中本质是通配符,起占位作用,代表最终传入泛型类的类型。

类型形参规则:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型

泛型类的使用

定义一个顺序表:

public class MyArrayList<E>{
    private E[] array;
    private int size;
    
    public void add(E val){};//尾插
    public E get(int index){};
}

使用顺序表:

MyArrayList<Dog> dogs = new MyArrayList<>();
dogs.add(new Dog()); //向顺序表中增加元素

Dog dog = dogs.get(0);//取出顺序表中下标为0位置的元素

通过以上代码,可以发现泛型类的一个使用方式:只需要在所有类型后边跟尖括号,并且在尖括号内传入类型,就可以指定当前类能够处理的类型,不能在放入其他类型,相当于在编译时做了一次类型检查,并且在取出数据时自动对类型进行了强制转换

需要注意:
泛型是编译时期的机制,运行时尖括号中的类型会被擦除替换成Object,也就是说,<>中的内容只是对放入的数据进行了类型检查,保证存入的数据类型一致,而实际放入的数据还是会转成Object类型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值