----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
泛型是JDK1。5版本以后出现的新特性。用于解决安全问题,是一个安全机制。出现的主要原因有:1、将运行时期出现问题ClassCastException,转移到编译时期,方便于程序员解决问题,让运行时问题减少,安全。2、避免了强制转换的麻烦。定义泛类的方法是<>里面来定义要操作的引用数据类型。注意,因为equals方法是来至于Object,出现在1.0版本,所以equals方法里面一定要强制转换。泛类主要运用于定义泛类类和接口,或者定义泛类方法。
定义泛型类和接口。定义泛类类和接口的方法是,在类名后面加上<E>。如下面的演示:
import java.util.*; public class GenericClassDemo { public static void main(String[] args) { GenericStack<String> stack = new GenericStack<>(); stack.push("abc1"); stack.push("abc2"); stack.push("abc3"); stack.push("abc4"); // stack.push(1); //插入不是String类型的,编译是就会报错 String a = stack.peek(); //不用类型转换 String b = stack.pop(); int num = stack.getSize(); boolean i = stack.isEmpty(); System.out.println(a); System.out.println(b); System.out.println(num); System.out.println(i); } } class GenericStack<E>{ //运用泛型来定义一个类 private ArrayList<E> arrayList = new ArrayList<>(); public int getSize() { return arrayList.size(); } public E peek() { return arrayList.get(getSize() - 1); } public void push(E o) { arrayList.add(o); } public E pop() { E o = arrayList.get(getSize() - 1); arrayList.remove(getSize() - 1); return o; } public boolean isEmpty() { return arrayList.isEmpty(); } }
定义泛型方法:定义泛类方法的是把泛类定义在返回值之前,然后参数里面就可以运用泛类了。需要注意的是,静态方法不可以访问类中上定义的泛类,因为静态方法比对象先存在于内存中。这个时候,可以把泛类定义在方法上。调用泛类方法的时候,需要将实际类型放在<>内作为方法名的前缀。下面是定义泛类方法的演示:
public class GenericFunctionDemo { public static void main(String[] args) { Integer[] integers = {1, 2, 3, 4}; String[] strings = {"abc1", "abc2", "abc3", "abc4"}; print(integers); print(strings); } public static <E> void print(E[] list) { for (int i = 0; i < list.length; i++) { System.out.println(list[i] + " "); } System.out.println(); } }
泛型的限定。举个例子来说明。ArrayList<Person> a = new ArrayList<Student>(),这条语句是会报错的。虽然Person是Student的父类,但是并不能说ArrayList<Person>就是ArrayList<Student>的子类。JAVA中的限定有向上限定和向下限定。向上限定的表现形式:? extends E,向下限定的形式是? super E。下面演示这个限定的用法
import java.util.*; public class GenericBindDemo { public static void main(String[] args) { GenericStack<Integer> intStack = new GenericStack<Integer>(); intStack.push(1); intStack.push(2); intStack.push(3); System.out.println(max(intStack)); } public static double max(GenericStack<? extends Number> stack) { double max = stack.pop().doubleValue(); while (!stack.isEmpty()) { double value = stack.pop().doubleValue(); if (value > max) { max = value; } } return max; } } class GenericStack<E extends Number>{ //运用泛类来定义一个类 private ArrayList<E> arrayList = new ArrayList<>(); public int getSize() { return arrayList.size(); } public E peek() { return arrayList.get(getSize() - 1); } public void push(E o) { arrayList.add(o); } public E pop() { E o = arrayList.get(getSize() - 1); arrayList.remove(getSize() - 1); return o; } public boolean isEmpty() { return arrayList.isEmpty(); } }
注意:编译器使用泛型类型信息来编译代码,但随后会消除它,所以不能使用new E();不能使用 new E[]。静态环境下不允许类的参数是泛型类型。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
详情请查看:http://edu.csdn.net/heima