把元素的类型设计成一个参数,这个参数类型叫做泛型。
代码举例:
public class GenericTest { @Test public void test1(){ //在集合中使用泛型的情况:以ArrayList为例 // ArrayList<Integer> list = new ArrayList<Integer>(); //jdk7新特性:类型推断 ArrayList<Integer> list = new ArrayList<>(); list.add(99); list.add(100); list.add(88); //方式一: for (Integer integer:list){ System.out.print(integer+" "); } System.out.println(); //方式二: Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()){ System.out.print(iterator.next()+" "); } System.out.println(); //在集合中使用泛型的情况:以ArrayList为例 HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("Tom",123); map.put("Jerry",456); map.put("Jack",789); Set<Map.Entry<String, Integer>> set = map.entrySet(); Iterator<Map.Entry<String, Integer>> iterator1 = set.iterator(); while (iterator1.hasNext()){ //System.out.print(iterator1.next()+" "); Map.Entry<String, Integer> ee = iterator1.next(); String key = ee.getKey(); Integer value = ee.getValue(); System.out.println(key + ":"+value); } } }①public class SubOrder extends Order//此时子类时普通类 由于子类在继承带泛型的父类时,指明了泛型类型,则实例化子类对象时,不再需要指明泛型。 ②public class SubOrder1 extends Order//此时子类也是泛型类
①泛型不同的引用不能相互赋值
ArrayList<Integer>list1=null; ArrayList<String>list2=null;此时list1和list2不能相互赋值。
②类型推断
Order<String> order1 = new Order<>();③静态方法中不能使用类的泛型。
④异常类不能是泛型的。
⑤不能使用new E[]。但是可以:E[] elements = (E[]) new Object[];
代码举例:
//自定义泛型类 public class Order<T> { String orderName; Integer orderId; //类的内部结构就可以使用类的泛型 T orderT; public Order(){ } public Order(String orderName, Integer orderId, T orderT) { this.orderName = orderName; this.orderId = orderId; this.orderT = orderT; } public T getOrderT() { return orderT; } public void setOrderT(T orderT) { this.orderT = orderT; } @Override public String toString() { return "Order{" + "orderName='" + orderName + '\'' + ", orderId=" + orderId + ", orderT=" + orderT + '}'; } } //测试自定义泛型类 @Test public void test1(){ //如果定义了泛型类,实例化没指明类的泛型,则认为此泛型类型为Object类型。 //若果定义了类是泛型类的,建议实例化时要指明类的泛型。 Order order=new Order(); order.setOrderT(123); order.setOrderT("abc"); Order<String> order1 = new Order<String>("orderAA",23,"order:AA"); order1.setOrderT("AA:hello"); }在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系。 换句话说,泛型方法所属的类是不是泛型类都没有关系。 泛型方法可以声明为静态的。原因:泛型参数是在调用方法时确定的。并非在实例化类时确定。
public static <E> List<E> copyFromArrayToList(E[] arr){ ArrayList<E> list = new ArrayList<>(); for(E e : arr){ list.add(e); } return list; } //测试泛型方法 @Test public void test4(){ Order<String> order = new Order<>(); Integer[] arr = new Integer[]{1,2,3,4}; //泛型方法在调用时,指明泛型参数的类型。 List<Integer> list = order.copyFromArrayToList(arr); System.out.println(list); }