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的子类的实例对象 }