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的子类的实例对象
}
原文地址:https://www.cnblogs.com/wenxuehai/p/12850790.html