1、泛型使用的原因:
安全:放入会自动检查,如果类型错误编译器会报错
List<String> list = new ArrayList<>(); list.add("abc"); list.add(1); //报错无法放入整数
省心:取出的时候自动转为想要的类型
String strGet = list.get(0); //取出就是String类型否则需要强制转换,因为list.get(int index)取出的是Object类型
List list = new ArrayList(); list.add("abc"); Object objGet = list.get(0); if(objGet instanceof String) { String strGet = (String)objGet; //取出就是String类型 }
2.自定义泛型类,例如在自定义个一个栈,因为栈里面放入的数据类型不确定的,所以这边可以使用泛型,方法:类定义时,类名<字母>。
示例:
class myStack<Item> //栈中的元素类型未知,使用自定义泛型类 { private Item[] a; //声明一个泛型数组 private int N; public myStack(int cap) { a = (Item[])new Object[cap]; } public boolean isEmpty() { return N==0; } public void push(Item item) { a[N++] = item; } public Item pop() { return a[--N]; } } class Test { public static void main(String[] args) { myStack<String> stack = new myStack<>(4);//这边栈对象只能添加String类型的数据 } }
注意:创建泛型数组是不允许的,即无法使用Item[] a = new Item[cap]的方式,要使用类型转换,Item[] a = (Item[])new Object[cap]。
3.泛型接口
public interface Comparator<T> { int MAX_VALUE = 1024; void compare(T t); }
说明:T只能用在抽象方法上,不能用在修饰MAX_VALUE,例如T MAX_VALUE就会报错。
4.非泛型类中定义泛型方法
方法:在返回类型前面<字母>
示例:
public class Method { public static void main(String[] args) { test("HelloWorld"); } public static <T> void test(T t)//泛型方法的使用 { System.out.println(t); } }
使用泛型方法的好处:test方法中,可以传入任意类型的数据,并将其打印出来,上面例子中,传入后"HelloWorld"就将T变成了字符串类型。
将这个方法局限在某些类型下:public static <T extends List>void test(T b),T类型只能是List类型或者List类型的子类型。
class Method { public static void main(String[] args) { //test("HelloWorld"); // 报错 List list = new ArrayList(); list.add("abc"); test(list); //对象list是List的子类 } public static <T extends List> void test(T b)//这时T只能是List的子类 { System.out.println(b); } }