Java泛型

博客围绕泛型展开,介绍了泛型本质是类型参数化,使用需先声明再使用。阐述了泛型的擦除机制,即编译时类型检查,运行时不考虑类型。还提及泛型不支持继承,介绍了泛型通配符,以及定义泛型类、方法和接口的相关内容。

目录

泛型基本介绍

泛型的擦除机制

泛型不支持继承

泛型通配符:? 

定义泛型类

定义泛型方法

定义泛型接口


泛型基本介绍

泛型本质:类型参数化(即将参数的类型又进行了参数化)

泛型使用:先声明再使用 声明方法如 <T>

泛型方法:1.实例方法:可以使用类上声明的泛型,也可以使用本方法上声明的泛型

                2. 静态方法:只能使用本方法上声明的泛型

泛型的擦除机制

在编译时候会类型检查,真正执行的时候就不管类型了,一律加进去。

//list不加类型限制,可以添加任何类型      
    ArrayList list = new ArrayList<>();
    list.add("name");
    list.add(123);
    list.add(new User());
    System.out.println(list);
  //添加了类型限制,只能添加限制的类型
        ArrayList<Integer> list = new ArrayList<>();
        list.add(23);
        list.add("name");
//上面list通过反射可以给其添加任意值
        ArrayList<Integer> list = new ArrayList<>();
        list.add(23);
        Class<? extends ArrayList> clazz = list.getClass();
        Method addMethod = clazz.getDeclaredMethod("add", Object.class);
        addMethod.invoke(list, "name");
        System.out.println(list);//name添加了进去


运行结果:

泛型不支持继承

泛型通配符:? 

/**
3种通配符如下:
   1.?:代表任何类型都可以
   2.? extends UserFather:所以继承自UserFather的都可以接收
   3.? super  User:是User父亲的
*/
 @Test
    public void test1() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<String> stringArrayList = new ArrayList<>();
        ArrayList<Integer> integerArrayList = new ArrayList<>();
        //俩个list都可以传入
        play(stringArrayList);
        play(integerArrayList);
    }
    public void play(List<?> list){
        System.out.println(list);
    }

 @Test
    public void test2() {
        ArrayList<UserFather> userFathers = new ArrayList<>();
        ArrayList<User> users = new ArrayList<>();
        play1(userFathers);
        play1(users);
        play2(userFathers);
        play2(users);
        ArrayList<Object> objects = new ArrayList<>();
        play1(objects);
    }

    //List<? super User> :参数是User的父亲
    public void play1(List<? super User> list) {
        System.out.println(list);
    }

    //List<? extends UserFather>:参数继承自UserFather
    public void play2(List<? extends UserFather> list) {
        System.out.println(list);
    }

定义泛型类

public class FanXing<T> {
    Object[] objects = new Object[12];
    int index = 0;

    public void add(T t) {
        objects[index++] = t;
    }

    public T get(int index) {
        return (T) objects[index];
    }

    public static void main(String[] args) {
        FanXing<String> fanXing = new FanXing<>();
        fanXing.add("zhangsan");
        fanXing.add("lisi");
        System.out.println(fanXing.get(0));//---->zhangsan
        System.out.println(fanXing.get(1));//----->lisi
    }
}

定义泛型方法

public class FanXing {
    Object[] objects = new Object[10];
    int index = 0;

    public <T> void add(T t) {
        objects[index++] = t;
    }

    public <T> T get(int index) {
        return (T) objects[index];
    }

    public static void main(String[] args) {
        FanXing fanXing = new FanXing();
        fanXing.add(123);
        fanXing.add("123");
        fanXing.add(new User());
        Object o1 = fanXing.get(0);
        System.out.println(o1);
        Object o2 = fanXing.get(1);
        System.out.println(o2);
        Object o3 = fanXing.get(2);
        System.out.println(o3);
    }
}

运行结果:

 

定义泛型接口

//接口类
public interface FanXing<T> {
    public void add(T t);

    public T get(int index);
}

//实现类
public class FanXingImpl implements FanXing<String> {
    Object[] objects = new Object[10];
    int index = 0;

    @Override
    public void add(String s) {
    }

    @Override
    public String get(int index) {
        return null;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值