类型通配符

一、类型通配符

当声明一个方法时,某个形参的类型是一个泛型类或泛型接口类型,但是在声明方法时,又不确定该泛型实际类型,可以考虑使用类型通配符。

先来看下面一个案例

import java.util.ArrayList;
import java.util.List;

/*
泛型中通配符

常用的 T,E,K,V,?

?*通配符,表示不确定的 java 类型,代表任意类型,有位置有求
  需要传入具体类型的位置,不能单独使用
  声明,泛型类,泛型接口,泛型方法时不能单独使用

T (type) 表示具体的一个java类型
K V (key value) 分别代表java键值中的Key Value
E (element) 代表Element

上界通配符 < ? extends E>  传入的类型,可以是当前类型以及当前类型的孩子
下界通配符 < ? super E>    传入的类型,可以使当前类型,也可以是当前类型的父类

?和 T 的区别
* */
public class Demo1 {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("项羽");
        list1.add("刘邦");
        list1.add("张饵");
        test1(list1);

    }

    public static void test1(List c){
        for (int i = 0; i <c.size() ; i++) {
            System.out.println(c.get(i));
        }
    }
}

上面的方法执行是没有问题的,但是此处使用 List 接口时没有传入实际类型参数,这将引起泛型警告。如何消除这个警告呢?

  方式一:

public class Demo1 {
    public static void main(String[] args) {
        List<Object> list1 = new ArrayList<>();
        list1.add("项羽");
        list1.add("刘邦");
        list1.add("张饵");
        test1(list1);

    }

    public static void test1(List<Object> c){
        for (int i = 0; i <c.size() ; i++) {
            System.out.println(c.get(i));
        }
    }
}

这样的形参太局限了,只能传入 List<Object> 类型的实参。

  方式二:声明一个泛型方法

public class Demo1 {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("项羽");
        list1.add("刘邦");
        list1.add("张饵");
        test1(list1);

    }

    public static<T> void test1(List<T> c){
        for (int i = 0; i <c.size() ; i++) {
            System.out.println(c.get(i));
        }
    }
}

该方法需要声明泛型形参T。

  方式三:使用类型通配符

上一篇:Python 列表List - Python零基础入门教程


下一篇:【python】enumerate 枚举列表