【Java SE】泛型

一、什么是泛型

定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>),称为泛型类、泛型接口、泛型方法。

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();//规定了必须是String类型
        list.add("hi~");
        list.add("hello~");

        for (int i=0;i<list.size();i++){
            String a = list.get(i);
            System.out.println(a);
        }
    }

}

作用:提供了在编译阶段约束能操作的数据类型并自动进行检查的能力,这样可以避免强制类型转换及其可以出现的异常。

本质:把具体的数据类型作为参数传给类型变量

二、自定义泛型

2.1. 泛型类

MyArrayList.java

public class MyArrayList <E>{
    private Object[] arr = new Object[10];
    private int size;
    public boolean add(E e){
        arr[size++] = e;
        return true;
    }

    public E get(int index){
        return (E) arr[index];
    }
}

 Main.java

public class Main {
    public static void main(String[] args) {
        //规定了只能接收String类型的
        MyArrayList<String> list = new MyArrayList<>();
        list.add("java1");
        list.add("java2");
        String ele = list.get(1);
        System.out.println(ele);
    }

}
//输出结果
//java1

可以设定多个参数类型,如

public class MyClass <E,T>{
    public void put(E e,T t){
        ...
    }
}

也可以实现泛型数据类型的继承

此时规定的数据类型必须是继承Animal类的类或者就是Animal类👇

public class MyClass2 <E extends Animal>{
        ...
}

 

2.2. 泛型接口

泛型接口👇👇👇

public interface Data<T> {
    void add(T t);
    ArrayList<T> getByName(String name);
}

实现类实现接口👇👇👇

mac快捷键【control+回车】

public class TeacherData implements Data<Teacher>{
    @Override
    public void add(Teacher teacher) {

    }

    @Override
    public ArrayList<Teacher> getByName(String name) {
        return null;
    }
}

同理也可以实现继承

2.3. 泛型方法

public class Test {
    public static void main(String[] args) {
        //此时T为String类型
        System.out.println(test("java"));

        //此时的T为Dog类型
        Dog d = test(new Dog());
        System.out.println(d);

    }
    public static <T> T test(T t){
        return t;
    }
}

具体示例如下

public class Test {
    public static void main(String[] args) {
        //创建一个宝马车的ArrayList对象(BMW类继承于Car类)
    	ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        go(bmws);

        //创建一个奔驰车的ArrayList对象(BENZ类继承于Car类)
    	ArrayList<BENZ> benz = new ArrayList<>();
        benz.add(new BENZ());
        benz.add(new BENZ());
        go(benz);
    }

    //第一种方法
    public static<T extends Car> void go(ArrayList<T> cars){
    }
    //第二种方法
    //?代表通配符,在使用泛型时代表一切类型
    //public static void go(ArrayList<? extends Car> cars){
    //}
}

泛型上限:? extends Car(上限):?只能是Car或者是Car的子类

泛型下限:? super Car(下限):?只能是Car或者是Car的父类

三. 泛型的擦除问题和注意事项

  • 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
  • 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RexHarrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值