Java泛型

    xiaoxiao2023-11-06  140

    目录

    泛型基本介绍

    泛型的擦除机制

    泛型不支持继承

    泛型通配符:? 

    定义泛型类

    定义泛型方法

    定义泛型接口


    泛型基本介绍

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

    泛型使用:先声明再使用 声明方法如 <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; } }

     

    最新回复(0)