java高级编程之泛型

1.泛型的概述

        个人对泛型的理解:就像公厕中的男女厕所,男的进男厕所,女的进女厕所。反省也是如此,泛型就是类型参数化,就好比我建了一栋房子,在门口竖了个牌子说:我会让我的亲戚朋友进来,不允许陌生人进来。

2.泛型在集合中的应用

        2.1不使用泛型

 // 1.不使用泛型
List list = new ArrayList();   
list.add("1");
list.add('2');
list.add(3);
list.add(new String());

        你会发现,在集合中不使用泛型的时候,什么类型都能往list容器放,这虽然不会报错,但如果你遍历list就有可能会报错

        2.2使用泛型

 // 1.使用泛型
List<String> list = new ArrayList<>();   
list.add("1");
list.add('2');        // 编译不通过
list.add(3);           // 编译不通过
list.add(new String());    // 编译通过

        你会发现,在使用泛型之后,如果不是String类型的就不允许你放入到list容器中,在编译阶段就会报错,减少了你在运行时阶段出错的概率 

3.泛型类,自定义泛型类,泛型接口,泛型方法的使用

        3.1泛型类的使用

package com.atguigu.java;

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

public class Order<T> {
    String orderName;
    int orderId;
    T orderNumber;
    public Order(){}
    public Order(String orderName, int orderId,T orderNumber){
        this.orderId = orderId;
        this.orderName = orderName;
        this.orderNumber = orderNumber;

    }

    public void setOrderNumber(T orderNumber) {
        this.orderNumber = orderNumber;
    }

    public T getOrderNumber() {
        return orderNumber;
    }

   public <E> List<E> copyArrayFromList(E[] array){
       ArrayList<E> arrayList = new ArrayList<>();
       for(E e:array){
           arrayList.add(e);

       }
       return  arrayList;

   }

}

        3.2泛型接口的使用类似于泛型类,在此不再赘述

        3.3泛型方法

                

 public <E> List<E> copyArrayFromList(E[] array){
       ArrayList<E> arrayList = new ArrayList<>();
       for(E e:array){
           arrayList.add(e);

       }
       return  arrayList;

   }

        泛型方法所在的类既可以是一个泛型类,也可以是一个非泛型类,在泛型方法中返回值类型前面一定要加个<E>,字母无所谓。要不然,不同于此类型结构的方法都不是泛型方法。

        3.4自定义泛型类

        

package com.atguigu.java;

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

public class Order<T> {
    String orderName;
    int orderId;
    T orderNumber;
    public Order(){}
    public Order(String orderName, int orderId,T orderNumber){
        this.orderId = orderId;
        this.orderName = orderName;
        this.orderNumber = orderNumber;

    }

    public void setOrderNumber(T orderNumber) {
        this.orderNumber = orderNumber;
    }

    public T getOrderNumber() {
        return orderNumber;
    }

   public <E> List<E> copyArrayFromList(E[] array){
       ArrayList<E> arrayList = new ArrayList<>();
       for(E e:array){
           arrayList.add(e);

       }
       return  arrayList;

   }

}

        在自定义泛型类时需要注意,在类或接口上声明的泛型,在本类/本接口即代表某种类型,可以作为非静态属性的类型,可以作为非静态方法的返回值类型,,可以作为非静态方法的参数类型。但是静态方法中不能使用泛型。父类有泛型,子类可以选择保留父类泛型,或指定新的泛型

4.泛型通配符?

        4.1 下界

        诸如List<? super Person>,此谓下届,也就是说往list里面放的东西至少是一个Person类型,不能是Person的子类。

        4.2 上界

        诸如List<? extends Person>,此谓上界,也就是说往list里面方的东西至多是一个Person类型,不能是Person1的父类。

 @Test
    public void test1(){
        List<? extends Person> list = null;
        List<? super Person> list1 = null;
        List<Student> list2 = new ArrayList<>();
        List<Person> list3 = new ArrayList<>();
        List<Object> list4 = new ArrayList<>();
        list = list2;
        list = list3;
       // list = list4;
       //  list1 = list2;
        list1 = list3;
        list1 = list4;
    //  list.add(new Student());
    //  list.add(new Person());
    //  list.add(new Object());
        list1.add(new Student());
        list1.add(new Person());
    //  list1.add(new Object());


    }

        写了//都是编译不通过的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值