泛型

泛型的使用

1、使用:对于有泛型的类型,在这些类型后面跟上尖括号,尖括号里面写上泛型的确定类型(在使用某个类创建对象时,已经可以确定这个具体的类型了,那么就直接写出具体类型)

例如:

ArrayList<Integer> al = new ArrayList<Integer>();

注意事项:

1、前后一致:在创建对象时,赋值符号前面和后面的类型的泛型,必须一致

2、泛型推断:如果前面的引用所属的类型已经写好了泛型,后面创建对象的类型就可以只写一个尖括号,尖括号中可以不写任何内容。<>特别像菱形,称为“菱形泛型”,jdk1.7特性

泛型类的定义

带着泛型定义的类

格式:

class 类名<泛型类型1, 泛型类型2, …> {

}

1、类名后面跟着的泛型类型,是泛型的声明,一旦泛型声明出来,就相当于这个类型成为了已知类型,这个类型就可以在整个类中使用

2、泛型的声明名称,只需要是一个合法的标识符即可,但是通常我们使用单个大写字母来表示,常用字母:T、W、Q、K、V、E

3、泛型确定的时机:将来在使用和这个类,创建对象的时候

泛型方法的定义

格式:

修饰符 <泛型声明1, 泛型声明2,…> 返回值类型 方法名称(参数列表) {

}

1、在方法上声明的泛型,可以在整个方法中,当做已知类型来使用

2、如果【非静态】方法上没有任何泛型的声明,那么可以使用类中定义的泛型

3、如果【静态】方法上没有任何的泛型声明,那么就不能使用泛型,连类中定义的泛型,也不能使用,因为类中的泛型需要在创建对象的时候才能确定。所以【静态】方法想使用泛型,就必须在自己的方法上单独声明。

public static void main(String[] args) {
       // 3. 测试带有泛型的静态方法功能
       String[] arr = {"a","b","c","d"};
       // W[] arr,int index1, int index2
       FanXingMethod.changeArrayELe(arr,1,2);// [a, c, b, d]

       Integer[] arr1 = {1,2,3,4,56};
       FanXingMethod.changeArrayELe(arr1,1,2);// [1, 3, 2, 4, 56]
   }

泛型的通配符

第一种形式,使用?来表示可以是任意类型,例如:

Collection接口中的removeAll(Collection<?> c),表示可以接收任意泛型类型的集合,作为该方法的实际参数,参数集合的泛型,可以是与E没有任何关系

第二种形式,使用? extends E来表示必须是某个泛型类型或是该泛型类型的子类,例如:

Collection接口中的addAll(Collection<? extends E> c),表示可以接收泛型类型是调用者泛型类型或者其子类的集合,作为该方法的实际参数。参数的泛型和调用者的泛型,必须有关(相同或者是子父类)。确定了泛型的上边界。

第三种形式,使用? super E来表示必须是某个泛型类型或者是该泛型类型的父类,例如:

Arrays工具类中,排序方法static void sort(T[] a, Comparator<? super T> c),T是该方法的泛型,T表示的是数组中元素的类型,<? super T>表示可以接收泛型类型是数组元素类型T或者是元素类型T的父类的比较器,作为sort方法的参数。参数的泛型和方法的泛型,必须有关(相同或者是子父类)。确定了泛型的下边界。

 public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");

        ArrayList<Integer> li = new ArrayList<>();
        li.add(1);
        li.add(2);
        // 1. removeAll(Collection<?> c): 参数集合可以是任意泛型类型
        // ? : 表示泛型的通配符,表示任意泛型类型
        list.removeAll(li);

        // 2. addAll(Collection<? extends E> c):
        // 1) E泛型表示方法调用集合中具有的泛型类型--->list中的String类型
        // 2) ? extends E : ? 表示的泛型需要是E类型本身或者是E类型的任意一个子类类型
        // 3) 为什么限定 ? extends E, 方法是添加功能, 只有参数集合中的数据可以添加到list集合中才能让这个方法正常进行添加
        // list.addAll(li);

        ArrayList<Object> list2 = new ArrayList<>();
        list2.addAll(list);

        // 3. ? super T :
        // sort(T[] arr,Comparator<? super T> c)
        // ? 表示的泛型类型需要是T类型本身, 或者是T类型的父类类型
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值