总结于尚硅谷学习视频
GenericTest 类
package com.day0309_2; import org.junit.jupiter.api.Test; import java.util.*; /** * 泛型的使用 * 1.jdk5.0新增的特性 * * 2.在集合中使用泛型: * 总结: * 1 集合接口或集合类在jdk5.0时都修改为带泛型得到结构。 * 2 在实例化集合类时可以指明具体的泛型类型 * 3 指明完以后,在集合类或接口中凡是定义类或接口,内部结构(比如方法、构造器、属性)使用到类的泛型类型的位置,都指定为实例化的泛型类型 * 比如:add(E e)-->实例化后:add(Integer e) * 4 注意点:泛型的类型必须是类,不能是基本数据类型。需要基本数据类型,拿包装类替换 * 5 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型。 * * 3.如何自定义使用泛型结构:泛型类、泛型接口;泛型方法。见GenericTest1.java * * */ 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) { //问题二:强转时,可能出现ClassCastException int stuScore = (int) score; System.out.println(stuScore); } } //在集合中使用泛型的情况:以ArrayList举例 @Test public void test2(){ ArrayList<Integer> list=new ArrayList<Integer>(); //需求:存放学生成绩 list.add(78); list.add(76); list.add(89); list.add(88); //编译时就会进行类型检查,保证数据的安全 // list.add("Tom"); //方式一 // for (Integer score : // list) { // //避免了强制操作 // int stuScore = score; // System.out.println(stuScore); // } Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()){ int stuScore = iterator.next(); System.out.println(stuScore); } } //在集合中使用泛型的情况:以HashMap举例 @Test public void test3(){ // Map<String,Integer> map=new HashMap<String,Integer>(); //jdk7新特性:类型推断 Map<String,Integer> map=new HashMap<>(); map.put("Tom",87); map.put("Jerry",87); map.put("Jack",87); // map.put(123,"ABC"); //泛型的嵌套 Set<Map.Entry<String,Integer>> entry=map.entrySet(); Iterator<Map.Entry<String, Integer>> iterator = entry.iterator(); while (iterator.hasNext()){ Map.Entry<String, Integer> e = iterator.next(); String key = e.getKey(); Integer value = e.getValue(); System.out.println(key+"-->"+value); } } }
GenericTest1 类
package com.day0309_2; import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; /** * 如何自定义使用泛型结构:泛型类、泛型接口;泛型方法。 * * 1.关于自定义泛型类、泛型接口: * * */ public class GenericTest1 { @Test public void test1(){ //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型 //要求:如果大家定义了类是带泛型的,建议在实例化是要指明类的泛型。 Order order=new Order(); order.setOrderT(123); order.setOrderT("ABC"); //建议:实例化时指明泛型类型 Order <String > order1=new Order<>("orderAA",1001,"AA"); order1.setOrderT("AA:hello"); } @Test public void test2(){ SubOrder sub1=new 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.copyFromArrayToList(arr); System.out.println(list); } }
Order类
package com.day0309_2; import java.util.ArrayList; import java.util.List; /** * 自定义泛型类 * @param <T> */ public class Order<T> { String orderName; int orderId; //类的内部就可以使用类的泛型 T orderT; public Order(){ //编译不通过 // T[]arr=new T[10]; //编译通过 T[] arr=(T[])new Object[10]; } public Order(String orderName,int 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 + '}'; } //静态方法不能使用类的泛型 // public static void show(T orderT){ // System.out.println(OrderT); // } public void show(){ //编译不通过 // try{ // // }catch (T t){ // // } } //泛型方法:在方法中出现了泛型的结构,泛型参数和类的泛型参数没有任何关系。 //换句话说,泛型方法所属的类是不是泛型类都没有关系。 //泛型方法:可以声明为静态的。原因:泛型参数是调用泛型方法时确定的,并非在实例化例是调用的 public static <E> List<E> copyFromArrayToList(E[] arr){ ArrayList<E>list=new ArrayList<>(); for(E e:arr){ list.add(e); } return list; } }
Person 类
package com.day0309_2; public class Person { }
SubOrder 类
package com.day0309_2; import java.util.ArrayList; import java.util.List; public class SubOrder extends Order<Integer>{//SubOrder:不再是泛型类 public static <E> List<E> copyFromArrayToList(E[] arr){ ArrayList<E>list=new ArrayList<>(); for(E e:arr){ list.add(e); } return list; } }
SubOrder1 类
package com.day0309_2; public class SubOrder1 <T>extends Order<T> {//SubOrder1<T>:仍然是泛型类 }