zoukankan      html  css  js  c++  java
  • Java泛型

    为什么需要泛型?

    1.编译的时候就会进行类型检查,保证类型安全。

    2.无需强转,避免类型转换异常。

     定义泛型类:

    public class Order<T> {
      T order;
    
    }

    如果定义了泛型类,实例化的时候没有指明类的泛型,则默认泛型类为Object。

    public class SubOrder extend Order<Integer> {
    
    }

    如果父类有泛型,子类可以保留父类的泛型,也可以不保留(如上)

    定义泛型方法:

    <T> T[] toArray(T[] a);

    在方法中出现泛型结构,其中T与所在类的泛型参数没关系

    什么时候用到泛型类?例子:

    public class DAO<T> { # 使用泛型方便对不同类型的数据进行操作
        public void add(T t) {//通用的数据库操作方法
    }
    public T get(int index) {
    }
    ... }
    public class Student extend DAO<Student> { } public class Customer extend DAO<Customer> { }

    为什么要通配符?

    因为类A是类B的父类,G<A>和G<B>是没有关系的,而二者的共同的父类是:G<?>

    所以:public void test() {

        List<Object> list1 = null;
        List<String> list2 = null;
    
        list1 = list2; # 会报错
        
        List<?> list = null;
        list = list1; # 没问题
        list = list2; # 没问题

    List<String> list3 = new ArrayList<>();
    list3.add("abc");
    list3.add("cde");

    list = list3; # 没问题
    list.add("fgh"); # 编译不通过,不能往list里面add除null之外的元素

    Object o = list.get(0); # 没问题,前提是o为Object对象
    }
    public void test2(List<Object> list) { #这个方法不能传List<String等其它类型>的参数 } public void test2(List<?> list) { #这个方法能传List<各种类型>的参数 }

     有限制条件的通配符的使用

    public class Student extend Person(){
    
    }
    
    
    
    List<? extends Person> list1 = null; #相当于(负无穷,Person]
    
    List<? super Person> list2 = null;#相当于[Person,正无穷)
    
    List<Student> list3 = null;
    
    List<Person> list4 = null;
    
    List<Object> list5 = null;
    
    
    
    list1 = list3; # List<? extends Person>可以做List<Student>的父类
    
    list1 = list4; # List<? extends Person>可以做List<Person>的父类
    
    list1 = list5; # 出错
    
    
    
    list2 = list3; # 报错
    
    list2 = list4; # List<? super Person>可以做List<Person>的父类
    
    list2 = list5; # List<? super Person>可以做List<Object>的父类

    list4 = new ArrayList<>();
    list1 = list4;

    Person p = list1.get(0);
    # 没问题
    Student s = list1.get(0); #报错

    list2 = list4;

    Object o = list2.get(0); # 没问题

    总结

    1.jdk 5.0新增的特性。

    2.在实例化集合类时,可以指明具体的泛型类型。

    3.泛型的数据类型必须是类,不能是基本数据类型。

    4.如果实例化是没有指明泛型的类型,默认类型为java.lang.Object类型。

    5.静态方法中不能使用类的泛型,因为静态方法可以再泛型未指定前被调用

    6.泛型方法可以声明为静态的。

    作者:Hahallo
             
    本文版权归作者和博客园共有,未经作者同意不能转载,否则保留追究法律责任的权利。
  • 相关阅读:
    jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解
    jQuery 源码解析(二十三) DOM操作模块 替换元素 详解
    jQuery 源码解析(二十二) DOM操作模块 复制元素 详解
    jQuery 源码分析(二十一) DOM操作模块 删除元素 详解
    jQuery 源码分析(二十) DOM操作模块 插入元素 详解
    jQuery 源码分析(十九) DOM遍历模块详解
    python 简单工厂模式
    python 爬虫-协程 采集博客园
    vue 自定义image组件
    微信小程序 image组件坑
  • 原文地址:https://www.cnblogs.com/bigyang/p/15143969.html
Copyright © 2011-2022 走看看