package cooom; import org.junit.Test; import java.util.*; /** * * 泛型的使用 * 1.jdk 5.0新增的特性 * 2.在集合中使用泛型: * 总结: * a.集合接口或集合类在jdk5.0是都修改为带泛型的结构 * b.在实例化集合类是,可以指明举例的泛型类型 * c.指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法,构造器属性等)使用到类的泛型的位置, * 都指定为实例化时泛型的类型 比如add(E e)----- >实例化以后add(Integer e) * d.注意点:泛型的类型必须是一个类,不能是基本数据类型,需要用到基本数据类型的时候用包装类替换 * e.如果实例化时没有指明泛型的类型,默认泛型为java.lang.Object类型 * 3.自定义泛型结构:泛型类丶泛型接口;泛型方法 。见:GenericTest.java * @author 冀帅 * @date 2020/8/13-12:06 */ public class GenericTest { //在集合中使用泛型之前的情况: @Test public void test1(){ ArrayList list = new ArrayList(); //需求:存放学生的成绩 list.add(78); list.add(76); list.add(89); list.add(88); //问题一:类型不安全(没有限制存放数据的类型) list.add("Tom"); for (Object score : list) {//取出来放到score里面 //问题二:强转时,可能出现类型转换异常(ClassCastException)。 int stuScore = (Integer) score;//Object转成Integer ,在自动拆箱 System.out.println(stuScore);//ClassCastException } } //在集合中使用泛型的情况:以ArrayList为例 @Test public void test2(){ //不能用int, 因为add()里是Object类型,int不属于。int默认值为0,Integer的默认值为NULL ArrayList<Integer> list = new ArrayList<Integer>(); list.add(78); list.add(87); list.add(99); list.add(65); // 在编译时就进行类型检查,保证数据安全 // list.add("Tom"); 编译错误 // 方式一遍历 // for (Integer score : list) { // int stuScore = score;//不用再强转了 // System.out.println(stuScore); // // } // 方式二遍历 Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } } //在集合中使用泛型的情况:以HashMap为例 @Test public void test3(){ Map<String,Integer> map = new HashMap<String,Integer>(); map.put("Tom",87); map.put("Jerry",87); map.put("Jack",67); // 遍历方式一:遍历键 // Set<String> set = map.keySet(); // Iterator<String> iterator = set.iterator(); // while (iterator.hasNext()){ // System.out.println(iterator.next()); // } // 遍历方式二:遍历键和值 // Set<Map.Entry<String, Integer>> set = map.entrySet(); // Iterator<Map.Entry<String, Integer>> iterator = set.iterator(); // while (iterator.hasNext()){ // System.out.println(iterator.next()); // } // 遍历方式三:遍历键和值 Set<String> set = map.keySet(); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()){ String key = iterator.next();//拿到键 Integer value = map.get(key); System.out.println(key+"---"+value); } } }
package cooom; import com.sun.org.apache.bcel.internal.generic.NEW; import org.junit.Test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** 自定义泛型结构:泛型类丶泛型接口;泛型方法 。 * * 1.关于自定义反省类,泛型接口: * * * * @author 冀帅 * @date 2020/8/13-22:41 */ public class GenericTest1 { @Test public void test1(){ //如果定义了泛型类,实例化时没有指明类的泛型,则认为此泛型类型为Object类型 //要求:如果定义了类带泛型的,建议在实例化时要指明泛型的类型 Order order = new Order(); order.setOrderT(123); order.setOrderT("ABC"); //建议:实例化时指明类的泛型 Order<String> order1 = new Order<String>("orderAA",1001,"order:AA"); order1.setOrderT("AA:hello"); } @Test public void test2(){ SubOrder sub1 = new SubOrder();//在定义SubOrder类时已经指定过泛型类型,不用在这里在指定了 //由于子类在继承带泛型的父类时,指明了泛型类型,则实例化子类对象时,不用再指明泛型类型。 sub1.setOrderT(1122); SubOrder1<String> sub2 = new SubOrder1<>(); sub2.setOrderT("order2..."); } @Test public void test3(){ //泛型不同的引用不能相互赋值 ArrayList<String> list1 = null; ArrayList<Integer> list2 = null; // list1 = list2; 编译错误 Person p1 = null; Person p2 = null; p1=p2; } //测试泛型方法 @Test public void test4(){ Order<String> order = new Order<>(); Integer[] arr = new Integer[]{1,2,3,4}; //泛型方法在调用时指明泛型参数的类型,与类的泛型毫无关系。 List<Integer> list = order.copyFromArryToList(arr);//由放进去的数组决定的是Integer System.out.println(list); // Iterator<Integer> iterator = list.iterator(); // while (iterator.hasNext()){ // System.out.println(iterator.next()); // } } }
package cooom; /** * @author 冀帅 * @date 2020/8/14-12:16 */ //异常类不能声明泛型类 //public class MyException <T> extends Exception{ //}
package cooom; import java.util.ArrayList; import java.util.List; /** * 自定义泛型类 * @author 冀帅 * @date 2020/8/13-22:26 */ public class Order <T> { String orderName; int orderId; //类的内部结构就可以使用类的泛型 T orderT;//定义一个不知道什么类型的变量orderT public Order(){ // 编译不通过 // T[] arr = new T[20] //编译通过 T[] arr = (T[]) new Order[1]; } public Order(String orderName,int orderId,T orderT){ this.orderId = orderId; this.orderName = orderName; 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 + '}'; } //静态方法中不能使用类的泛型。 //类的泛型在实例化(造对象)的时候指定,静态结构早于实例化,所以会错 // public static void show(T orderT){ // System.out.println(orderT); // } public void show(){ // 编译不通过 } // try { // // }catch (T t){ // // } // } //泛型方法:在方法中出现了泛型的结构,泛型的参数与类的泛型没有 任何关系 //泛型方法所属的类是不是泛型类都没有关系 //public后的<E>是为了让编译器知道E[]是个泛型,不是个类 //静态方法不能使用类的泛型(先加载静态方法,类型还没指定,所以错),但泛型方法可以是静态的(调用的时候就指定了) public static <E> List<E> copyFromArryToList(E[] arr){//参数设置为不确定类型的数组,然后把数组放到List中 ArrayList<E> list = new ArrayList<>(); for (E e : arr) {//把arr放到e中 list.add(e);//把e放到list中 } return list; } }
package cooom; /** * @author 冀帅 * @date 2020/8/14-12:02 */ public class Person { }
package cooom; /** * @author 冀帅 * @date 2020/8/13-22:51 */ public class SubOrder extends Order<Integer>{//SubOrder不再是泛型类 }
package cooom; /** * @author 冀帅 * @date 2020/8/13-22:55 */ public class SubOrder1<T> extends Order<T>{//SubOrder1<T>仍然为泛型类 }