Java中的泛型

泛型类和泛型方法的使用:类名<泛型>  方法名<泛型>

public class MyClass<E> {
    public void print(E e) {
        System.out.println(e);
    }
}
public class GenericTest {
    public static void main(String[] args) {
        MyClass<String> myClass1 = new MyClass<>();
        myClass1.print("String"); // String

        MyClass<Integer> myClass2 = new MyClass<>();
        myClass2.print(111); // 111
    }
}

泛型接口和泛型方法的使用:接口名<泛型>  方法名<泛型>

public interface MyInter<T> {
    public abstract void print(T t);
}
public class MyInterImpl2<T> implements MyInter<T> {
    @Override
    public void print(T t) {
        System.out.println(t);
    }
}
public class GenericTest {
    public static void main(String[] args) {
        MyInter<String> myInter2 = new MyInterImpl2<String>();
        myInter2.print("String"); // String
        MyInter<Integer> myInter3 = new MyInterImpl2<>();
        myInter3.print(111); // 111

        MyInter<String> myInter = new MyInter<String>() {
            @Override
            public void print(String s) {
                System.out.println(s);
            }
        };
        myInter.print("字符串类型"); // 字符串类型

        new MyInter<Integer>() {
            @Override
            public void print(Integer integer) {
                System.out.println(integer);
            }
        }.print(222); // 222
    }
}

泛型通配符:定义的时候不可以使用(ArrayList<?> list = new ArrayList<?>),只能作为参数传递时使用,表示可以接收任何泛型类型的参数

public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("AA");
        list1.add("BB");
        list1.add("CC");

        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(111);
        list2.add(222);
        list2.add(333);

        print(list1); // AA BB CC
        print(list2); // 111 222 333
    }

    private static void print(ArrayList<?> list1) { // 泛型不会自动提升类型,所以这里泛型不能使用Object类型来接收所有泛型类型,只能用通配符?
        /*Iterator<?> iterator = list1.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }*/

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

通配符高级使用--受限泛型

  泛型的上限:

    格式:类型名称 <? extends 类> 对象名称

    意义:只能接收该类型及其子类

  泛型的下限:

    格式:类型名称<? super 类> 对象名称

    意义:只能接收该类型及其父类

public static void main(String[] args) {
        ArrayList<Integer> integers = new ArrayList<>();
        ArrayList<String> strings = new ArrayList<>();
        ArrayList<Number> numbers = new ArrayList<>();
        ArrayList<Object> objects = new ArrayList<>();

        getElement1(integers);
        // getElement1(strings); // 报错
        getElement1(numbers);
        // getElement1(objects); // 报错

        // getElement2(integers); // 报错
        // getElement2(strings); // 报错
        getElement2(numbers);
        getElement2(objects);
    }

    private static void getElement1(ArrayList<? extends Number> integers) {
    }

    private static void getElement2(ArrayList<? super Number> integers) {
    }
posted @ 2019-12-23 23:52  糖不甜,盐不咸  阅读(196)  评论(0编辑  收藏  举报