泛型是一种“代码模板”,可以用一套代码套用各种类型。
泛型的定义,可以按照如下格式:
package com.sj; public class Person<T> { private T value; public Person() { } public Person(T value) { this.value = value; } public void setValue(T value) { this.value = value; } public T getValue() { return value; } // 静态方法,泛型使用方式不同,请注意。这里的“K”已经和泛型“T”不一样了 public static <K> Person<K> newInstance(K name) { return new Person<K>(name); } }T就是泛型,此外,要注意类名后面一定要带着<T>
泛型可以看作是一种“代码模板”。示例中的Person类,在创建对象时可以将泛型定义为任意类,则value属性就可以是任意类型。可是如果在Person类中,将value类型设置为Object,value也可以是任意类型啊,那么为什么要使用泛型呢?这里就要提到泛型的另一个作用:限制类型。比如ArrayList,我设置泛型为String,则你只能为ArrayList中添加String类型的值,如果为它添加其他类型的值,编译器就会报错。
public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add(new Person<Boolean>()); // 编译器报错 }此外,当你指定泛型之后,在取值的时候,也不需要强制转换类型。例如:
public static void main(String[] args) { List<String> list = new ArrayList<>(); String s = list.get(0); }