• Java的基本使用之泛型


    1、泛型的定义

    泛型就是定义一种模板,例如 ArrayList<T>,然后就可以为用到的类创建对应的 ArrayList<类型>。泛型的作用就是编写模板代码来适应任意类型,然后我们就可以使用泛型来限制集合只可以存入某种类型的数据。

    //下面定义了一种模板,即泛型。T可以是任何class
    public class ArrayList<T> {
        private T[] array;
        private int size;
        public void add(T e) {...}
        public void remove(int index) {...}
        public T get(int index) {...}
    }
    
    //编写一次模版,可以创建任意类型的ArrayList,如下:
    // 创建只可以存储String的ArrayList:
    ArrayList<String> strList = new ArrayList<String>();
    // 创建只可以存储Float的ArrayList:
    ArrayList<Float> floatList = new ArrayList<Float>();
    // 创建只可以存储Person的ArrayList:
    ArrayList<Person> personList = new ArrayList<Person>();

    编译器会针对类型作检查,这样一来,既实现了编写一次,万能匹配,又通过编译器保证了类型安全:这就是泛型。

    Java 中的泛型只在编译阶段生效。 

    2、使用泛型

    泛型使用代码示例:

    List<String> list = new ArrayList<String>();
    list.add("Hello");
    String first = list.get(0);
    
    List<Number> list = new ArrayList<Number>();
    list.add(new Integer(123));
    list.add(new Double(12.34));
    Number first = list.get(0);
    Number second = list.get(1);

    编译器如果能自动推断出泛型类型,就可以省略后面的泛型类型:

    List<Number> list = new ArrayList<Number>();
    
    //编译器看到泛型类型List<Number>就可以自动推断出后面的ArrayList<T>的泛型类型必须是ArrayList<Number>,因此,可以把代码简写为: List<Number> list = new ArrayList<>();

    3、编写泛型类

    通常来说,泛型类一般用在集合类中,例如ArrayList<T>,我们很少需要编写泛型类。但如果我们确实需要编写一个泛型,可以按照下面步骤进行编写:

    //先写一个类
    public class Pair {
        private String first;
        public Pair(String first) {
        }
        public String getFirst() {
            return first;
        }
    }
    
    //然后将特定类型转换成T,即可编写一个泛型
    public class Pair<T> {
        private T first;
        public Pair(T first) {
            this.first = first;
        }
        public T getFirst() {
            return first;
        }
    }
    Pair<String> t1 = new Pair<String>();    //在new Pair的时候指定泛型的类型String
    String s = t1.getFirst();    //在使用的时候就只能使用String类型

    4、泛型的通配符

    class Person {
        public void (List<?> list){   //test方法需要一个list集合的参数,但是不确定该list集合存的数的类型,此时可以用通配符,表示任何类型的数据都可以
    
        }
    }
    
    //使用
    Person p = new Person();
    List<Stiring> list = new List();
    p.test(list);
    
    List<Integer> list2 = new List();
    p.test(list2)
    <? extends Person>  //(无穷小, Person]   只允许放入Person或者Person的子类
    
    <? super Person>    //[Person, 无穷大)   只允许放入Person或者Person的父类
    
    <? extends Comparable>  //只允许放入实现了Comparable接口的实现类
    
    <? extends 接口名>  //只允许放入实现了该接口的实现类
    class Person {
         public void Test(List<? extends Animal> list) {}  //表示作为参数的集合,集合中只能存储Animal或者Animal的子类的实例对象
    }
  • 相关阅读:
    WebService协议
    用实例揭示notify()和notifyAll()的本质区别 收藏
    深入Java集合学习系列:HashMap的实现原理
    Oracle 索引扫描的五种类型
    Spring 异常
    Spring MVC
    银行家算法
    Java内存模型与多线程
    Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
    SpringMVC单元测试之MockMVC,模拟登入用户
  • 原文地址:https://www.cnblogs.com/wenxuehai/p/12850790.html
Copyright © 2020-2023  润新知