目录

  • 可变参数
  • 泛型
  • 泛型通配符
  • 类型通配符的上下限
  • 最后


可变参数

使用场景:参数类型确定,数量不确定,可以使用可变参数进行设置

格式:

用可变参数来编写求和的方法:

//调用方法时,可以传任意数量的实参,类型必须是int
public static int getSum(int... a){
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum += a[i];
        }
        return sum;
    }
public static void main(String[] args) {
        System.out.println(getSum(1, 2));
        System.out.println(getSum(1, 2, 3));
        System.out.println(getSum(1, 2, 3, 4));
    }

使用可变参数就节省了去方法重载的时间。

可变参数本质就是数组int…a 等价于 int[] a

注意事项:

1.方法中,可变参数只能有一个

2.可变参数要放在参数列表的最后

泛型

泛型:是JDK5中引入的特性,它提供了编译时类型安全检测机制

好处:

把运行时期的问题提前到了编译期间

避免了强制类型转换

统一数据类型

没有使用泛型,元素类型是任意的,弊端就是获取数据的时候,类型无法明确

public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("hello");
        //默认是Object类,那么就只能使用Object中的方法,
        //无法调用特有的方法
        Object o = list.get(0);
        //需要进行强转,才能调用length方法,可能存在类型转换异常
        String s = (String) list.get(0);
        System.out.println(s.length());
    }

泛型定义格式:
<类型>
比如:< E > < T >

<类型1,类型2>

定义泛型的地方
泛型类,ArrayList

定义一个泛型类,在new的时候确定泛型类型,如下使用的就全是String类型

class Person<E>{
    private E name;
    private E age;
}
Person<String> p1 = new Person<>();

泛型接口 List

泛型方法

//<T>是在定义泛型,在返回值之前定义,T[]是使用泛型
    //如果希望数组可以是其他类型,可以重载,弊端是方法需要定义多个
    //可以考虑使用泛型方法定义
    public static <T> void getSum(T[] arr){

    }

泛型通配符

前景导出:

定义Jeep,Bus继承自Car

//Jeep
public class Jeep extends Car{
}
//Bus
public class Bus extends Car{
}
//Car
public class Car {
}
public static void main(String[] args) {
        ArrayList<Car> cars = new ArrayList<>();
        ArrayList<Jeep> jeeps = new ArrayList<>();
        ArrayList<Bus> buses = new ArrayList<>();

        play(cars);
        //报错
        play(jeeps);
        play(buses);

    }
    //定义方法接收汽车类型,泛型不支持多态
    public static void play(ArrayList<Car> list){

    }

发现了泛型不支持多态,原本想法是Jeep和Bus继承了Car,那么也应该能用,实际上是不支持。

解决方法:使用通配符

通配符格式: ?

//让集合的泛型可以通配任何类型,可以使用?通配符
    public static void play(ArrayList<?> list){

    }
//<? extends Car>表示可以通配Car以及Car的子类
    public static void play(ArrayList<? extends Car> list){

    }
//<? super Car>表示可以通配Car以及Car的父类
    public static void play(ArrayList<? super Car> list){

    }

类型通配符的上下限

? super Car
泛型只能是Car以及Car的父类,规定了下边界

? extends Car
泛型只能是Car以及Car的子类,规定了上边界

最后

如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。