Java泛型(二)

泛型的应用

自定义泛型结构

自定义泛型类与接口

在实际开发中,我们可以根据需求来自定义泛型类和接口。具体格式为:

修饰符 class 类名 <T>

其中便是泛型。需要注意的是,在泛型类中可能会有多个参数,此时应将参数一起放到尖括号中:<T1,T2,T3>。

泛型类的构造器

在定义泛型类后,其构造器不用在声明泛型。如:定义了泛型类order其构造器应该是:

    public Order(T orderT, String orderName, int orderId) {
        this.orderT = orderT;
        this.orderName = orderName;
        this.orderId = orderId;
    }
    public Order() {
    }
泛型类的继承关系

父类是一个泛型类时,其子类可以选择保留泛型或者指定泛型。同时子类也可以有自己的泛型。
示例:

public class Order <T>{  //父类
    T orderT;
    String orderName;
    int orderId;
    public Order(T orderT, String orderName, int orderId) {
        this.orderT = orderT;
        this.orderName = orderName;
        this.orderId = orderId;
    }

    public Order() {
    }
    public int getOrderId() {
        return orderId;
    }
    
    public T getOrderT() {
        return orderT;
    }

    public void setOrderT(T orderT) {
        this.orderT = orderT;
    }

    @Override
    public String toString() {
        return "Order{" +
                "orderT=" + orderT +
                ", orderName='" + orderName + '\'' +
                ", orderId=" + orderId +
                '}';
    }
}
//子类 指定父类泛型
public class SubOrder extends Order<Integer>{
}
//子类 保留父类泛型
public class SubOrder01<T> extends Order<T>{
}

泛型在继承方面的体现
虽然A类是B类的父类,但是G和G不具有继承关系,是并列关系
A类是B类的父类,A<>和B<>也是继承关系

 public static void Test01(){
         Object[] o = new Object[10];
         String[] s = new String[10];
         o=s;//向上造型

         List<String> list = null;
         List<Object> list1=null;
泛型类的使用注意
  • 泛型不同不能相互赋值
  • 泛型类实例化之后,操作原来泛型位置的结构必须与指定泛型结构一致
  • 泛型若不指定,则会被擦除,泛型结构对应的结构将会设置为Object
  • 泛型类是抽象类或接口时,不能创建对象
  • 异常类不能时泛型类
  • 静态方法中不能使用泛型

泛型方法

泛型方法:在方法中出现了泛型结构,泛型参数与类的泛型参数没有任何关系。即泛型方法所属的类是不是泛型类没有直接关系。泛型方法可以是static 原因是:泛型参数是在调用方法是确定的,并非在实例化类时确定。

public static <E>List<E> copy(E[] arr) {
        ArrayList<E> es = new ArrayList<>();
        for (E e : arr) {
            es.add(e);
        }
        return es;
    }

注意: 泛型方法可以使用static 静态方法不可以使用泛型

通配符的使用

通配符: ?
A类是B类的父类,但是G和G不具有继承关系,是并列关系
G<?>是二者的父类。

	 public  void Test02(){
         List<String> list01=null;
         List<Object> list02=null;
         List<?> list=null;
//         list=list01;
//         list=list02;
         //遍历
//         printf(list01);
//         printf(list02);

         List<String> list03 = new ArrayList<>();
         list03.add("AA");
         list03.add("BB");
         list=list03;
         //list<?>不能添加数据,除了null
         //但是可以获取数据
         list.add(null);
         Object o = list.get(0);
         System.out.println(o);
     }
      public static void printf(List<?> list){
         Iterator<?> iterator = list.iterator();
         while(iterator.hasNext()){
             Object o=iterator.next();
             System.out.println(o);
         }
     }

有限制条件的通配符的使用
? extends Person
? super Student

 public void test03(){
        List<? extends Person> list1=null;
        List<? super Student> list2=null;

        List<Person> list3=null;
        List<Student> list4=null;
        List<Object> list5=null;
          //读取数据
        Person person = list1.get(0);

        Object person1 = list1.get(0);
          //写入数据
        list2.add(new Student());
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值