1. 举例

【Order.java】

  1. public class Order<T> {
  2. String orderName;
  3. int orderId;
  4. //类的内部结构就可以使用类的泛型
  5. T orderT;
  6. public Order(){
  7. //编译不通过
  8. // T[] arr = new T[10];
  9. //编译通过
  10. T[] arr = (T[]) new Object[10];
  11. }
  12. public Order(String orderName,int orderId,T orderT){
  13. this.orderName = orderName;
  14. this.orderId = orderId;
  15. this.orderT = orderT;
  16. }
  17. //如下的个方法都不是泛型方法
  18. public T getOrderT(){
  19. return orderT;
  20. }
  21. public void setOrderT(T orderT){
  22. this.orderT = orderT;
  23. }
  24. @Override
  25. public String toString() {
  26. return "Order{" +
  27. "orderName='" + orderName + '\'' +
  28. ", orderId=" + orderId +
  29. ", orderT=" + orderT +
  30. '}';
  31. }
  32. //静态方法中不能使用类的泛型。
  33. // public static void show(T orderT){
  34. // System.out.println(orderT);
  35. // }
  36. public void show(){
  37. //编译不通过
  38. // try{
  39. //
  40. //
  41. // }catch(T t){
  42. //
  43. // }
  44. }
  45. //泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没任何关系。
  46. //换句话说,泛型方法所属的类是不是泛型类都没关系。
  47. //泛型方法,可以声明为静态的。原因:泛型参数是在调用方法时确定的。并非在实例化类时确定。
  48. public static <E> List<E> copyFromArrayToList(E[] arr){
  49. ArrayList<E> list = new ArrayList<>();
  50. for(E e : arr){
  51. list.add(e);
  52. }
  53. return list;
  54. }
  55. }

【SubOrder.java】

  1. public class SubOrder extends Order<Integer> {//SubOrder:不是泛型类
  2. public static <E> List<E> copyFromArrayToList(E[] arr){
  3. ArrayList<E> list = new ArrayList<>();
  4. for(E e : arr){
  5. list.add(e);
  6. }
  7. return list;
  8. }
  9. }
  10. //实例化时,如下的代码是错误的
  11. SubOrder<Integer> o = new SubOrder<>();
  1. 【SubOrder1.java】
  2. public class SubOrder1<T> extends Order<T> {//SubOrder1<T>:仍然是泛型类
  3. }

【测试】

  1. @Test
  2. public void test1(){
  3. //如果定义了泛型类,实例化没指明类的泛型,则认为此泛型类型为Object类型
  4. //要求:如果大家定义了类是带泛型的,建议在实例化时要指明类的泛型。
  5. Order order = new Order();
  6. order.setOrderT(123);
  7. order.setOrderT("ABC");
  8. //建议:实例化时指明类的泛型
  9. Order<String> order1 = new Order<String>("orderAA",1001,"order:AA");
  10. order1.setOrderT("AA:hello");
  11. }
  12. @Test
  13. public void test2(){
  14. SubOrder sub1 = new SubOrder();
  15. //由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。
  16. sub1.setOrderT(1122);
  17. SubOrder1<String> sub2 = new SubOrder1<>();
  18. sub2.setOrderT("order2...");
  19. }
  20. @Test
  21. public void test3(){
  22. ArrayList<String> list1 = null;
  23. ArrayList<Integer> list2 = new ArrayList<Integer>();
  24. //泛型不同的引用不能相互赋值。
  25. // list1 = list2;
  26. Person p1 = null;
  27. Person p2 = null;
  28. p1 = p2;
  29. }
  30. //测试泛型方法
  31. @Test
  32. public void test4(){
  33. Order<String> order = new Order<>();
  34. Integer[] arr = new Integer[]{1,2,3,4};
  35. //泛型方法在调用时,指明泛型参数的类型。
  36. List<Integer> list = order.copyFromArrayToList(arr);
  37. System.out.println(list);
  38. }

2. 注意点

image.pngimage.png

3. 应用场景举例

【DAO.java】:定义了操作数据库中的表的通用操作。 ORM思想(数据库中的表和Java中的类对应)

  1. public class DAO<T> {//表的共性操作的DAO
  2. //添加一条记录
  3. public void add(T t){
  4. }
  5. //删除一条记录
  6. public boolean remove(int index){
  7. return false;
  8. }
  9. //修改一条记录
  10. public void update(int index,T t){
  11. }
  12. //查询一条记录
  13. public T getIndex(int index){
  14. return null;
  15. }
  16. //查询多条记录
  17. public List<T> getForList(int index){
  18. return null;
  19. }
  20. //泛型方法
  21. //举例:获取表中一共有多少条记录?获取最大的员工入职时间?
  22. public <E> E getValue(){
  23. return null;
  24. }
  25. }

【CustomerDAO.java】

  1. public class CustomerDAO extends DAO<Customer>{//只能操作某一个表的DAO
  2. }

【StudentDAO.java】

  1. public class StudentDAO extends DAO<Student> {//只能操作某一个表的DAO
  2. }