JAVA 泛型通配符、泛型上限、泛型下限 作者:马育民 • 2022-06-28 21:28 • 阅读:10070 # 说明 当使用泛型类或者接口时,传递的数据中,泛型类型 **不确定**,可以通过通配符 `>` 表示。 但是使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用,要使用需要强制转换。 ### 应用场景 泛型的通配符:**不知道使用什么类型来接收的时候,此时可以使用 `?`** 此时只能接受数据,不能往该集合中存储数据。 ### 例子 ```java //?代表可以接收任意类型 public static void test(List> list){ } public static void main(String[] args) { List list1 = new ArrayList<>(); test(list1); List list2 = new ArrayList<>(); test(list2); } ``` **注意:** 泛型 不存在继承关系 ```Collection list = new ArrayList();```这种是错误的。 # 受限泛型 之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的 **上限** 和 **下限** ### 应用场景 用在方法的形参上,限制泛型 # 泛型的上限 **格式**: `方法名 (类型名称 extends 类 > 形参名)` **作用**: 只能接收该类型及其子类 ### 案例 **要求:**定义方法,形参是 `List` 类型,其泛型只能是基本数据类型的 **分析:**由于泛型 **不能是基本数据类型**,但可以用与之相对应的 **包装类**,由于包装类都继承 `Number` 类,所以加上 **上限** ``` // 指定泛型,该泛型必须是 Number的子类,如:Integer、Double等 public static void test(List extends Number> list){ } public static void main(String[] args) { List list1 = new ArrayList(); test(list1); List list2 = new ArrayList(); test(list2); List list3 = new ArrayList(); // test(list3);//报错 List list4 = new ArrayList(); // test(list3);//报错 } ``` // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类 public static void getElement1(Collection extends Number> coll){} # 泛型的下限 **格式**: `方法名 (类型名称 super 类 > 形参名)` **作用**: 只能接收该类型及其父类型 ### 案例 **要求:**定义方法,形参是 `List` 类型,其泛型只能是 `Integer` 的父类 ``` public static void test(List super Integer> list){ } public static void main(String[] args) { List list1 = new ArrayList<>(); test(list1); List list2 = new ArrayList<>(); test(list2); List list3 = new ArrayList<>(); // test(list3);// 报错 List list4 = new ArrayList<>(); // test(list4); // 报错 } ``` 原文出处:http://malaoshi.top/show_1IX3a60vKF82.html