JAVA 泛型通配符、泛型上限、泛型下限

说明

当使用泛型类或者接口时,传递的数据中,泛型类型 不确定,可以通过通配符 <?> 表示。

但是使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用,要使用需要强制转换。

应用场景

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用 ?

此时只能接受数据,不能往该集合中存储数据。

例子

//?代表可以接收任意类型
public static void test(List<?> list){

}

public static void main(String[] args) {
    List<Intger> list1 = new ArrayList<>();
    test(list1);
    List<String> list2 = new ArrayList<>();
    test(list2);
}

注意: 泛型 不存在继承关系 Collection<Object> list = new ArrayList<String>();这种是错误的。

受限泛型

之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的 上限下限

应用场景

用在方法的形参上,限制泛型

泛型的上限

格式方法名 (类型名称 <? extends 类 > 形参名)
作用: 只能接收该类型及其子类

案例

要求:定义方法,形参是 List 类型,其泛型只能是基本数据类型的

分析:由于泛型 不能是基本数据类型,但可以用与之相对应的 包装类,由于包装类都继承 Number 类,所以加上 上限

// 指定泛型,该泛型必须是 Number的子类,如:Integer、Double等
public static void test(List<? extends Number> list){

}

public static void main(String[] args) {
    List<Integer> list1 = new ArrayList<Integer>();
    test(list1);


    List<Double> list2 = new ArrayList<Double>();
    test(list2);

    List<String> list3 = new ArrayList<String>();
//        test(list3);//报错


    List<Pet> list4 = new ArrayList<Pet>();
//        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<Integer> list1 = new ArrayList<>();
    test(list1);

    List<Number> list2 = new ArrayList<>();
    test(list2);

    List<String> list3 = new ArrayList<>();
//        test(list3);// 报错


    List<Pet> list4 = new ArrayList<>();
//        test(list4); // 报错
}

原文出处:http://malaoshi.top/show_1IX3a60vKF82.html