• 第18章--泛型


    1.泛型

     混进错误数据出错,出现类型转换异常

      1 import java.util.ArrayList;
      2 import java.util.Comparator;
      3 import java.util.HashMap;
      4 import java.util.Iterator;
      5 import java.util.List;
      6 import java.util.Map;
      7 import java.util.Map.Entry;
      8 import java.util.Set;
      9 import java.util.TreeSet;
     10 
     11 import org.junit.Test;
     12 
     13 /*
     14  * 泛型在集合中的使用
     15  * 
     16  * 1.泛型,是jdk5.0新增的
     17  * 
     18  * 2.泛型的核心思想:就是将集中添加的数据限定为具体的类型。
     19  */
     20 public class GenericTest {
     21     
     22     //在集合中使用泛型之前
     23     @Test
     24     public void test1(){
     25         ArrayList list = new ArrayList();
     26         list.add(67);
     27         list.add(87);
     28         list.add(99);
     29         list.add(78);
     30         //1.添加数据时:类型不安全
     31         list.add("AA");
     32         
     33         
     34         Iterator iterator = list.iterator();
     35         while(iterator.hasNext()){
     36             Object obj = iterator.next();
     37             //2.可能出现类型转换异常
     38             int score = (int) obj;
     39             
     40             System.out.println(score);
     41         }
     42         
     43     }
     44     /*
     45      * 集合中使用泛型的例子1
     46      * 
     47      * 在集合中使用泛型
     48      * 1.之所以能在集合接口或类中使用泛型,就是因为集合接口或类在声明时,使用了泛型。
     49      *     比如:public class ArrayList<E>{},public interface List<E>
     50      *  
     51      * 2.实例化集合类时,就可以指明类的泛型。一旦指明以后,通过集合类的对象调用内部的结构时,凡是使用了
     52      * 类的泛型的地方,都变化为指定的类的泛型的类型。
     53      *  比如:List<Integer> list = new ArrayList<Integer>();导致add(Integer e)、
     54      *  Integer<E> iterator();
     55      *  
     56      * 3.实例化集合类时,如果没有指明类的泛型,则认为此泛型的类型是Object类型。
     57      * 
     58      * 4.泛型参数在具体指明时,只能使用引用数据类型,不能使用基本数据类型
     59      */
     60     @Test
     61     public void test2(){
     62         List<Integer> list = new ArrayList<Integer>();
     63         
     64         list.add(67);
     65         list.add(87);
     66         list.add(88);
     67 //        list.add("BB");
     68         
     69         Iterator<Integer> iterator = list.iterator();
     70         while(iterator.hasNext()){
     71             int score = iterator.next();
     72             
     73             System.out.println(score);
     74         }
     75     }
     76     
     77     //集合中使用泛型的例子2
     78     @Test
     79     public void test3(){
     80         
     81         Map<String,Integer> map = new HashMap<String,Integer>();
     82 //        Map<String,Integer> map = new HashMap<>();//jdk7.新增类型推断。 比如:int[] arr = {1,2,3};
     83         
     84         map.put("MM", 78);
     85         map.put("JJ", 89);
     86         map.put("GG", 66);
     87         map.put("DD", 54);
     88 //        map.put(12, "AA");
     89         
     90         Set<Entry<String, Integer>> entrySet = map.entrySet();
     91         Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
     92         while(iterator.hasNext()){
     93             Entry<String, Integer> entry = iterator.next();
     94             String key = entry.getKey();
     95             Integer value = entry.getValue();
     96             System.out.println(key + "--->" + value);
     97         }
     98     }
     99     
    100     //使用上泛型以后的自然排序
    101     @Test
    102     public void test4(){
    103         
    104         TreeSet<Goods> set = new TreeSet<>();
    105         
    106         Goods g1 = new Goods("eggs", 10.5);
    107         Goods g2 = new Goods("banana", 7.5);
    108         Goods g3 = new Goods("apple", 2.5);
    109         Goods g4 = new Goods("orange", 4.3);
    110         
    111         
    112         set.add(g1);
    113         set.add(g2);
    114         set.add(g3);
    115         set.add(g4);
    116         
    117         for(Goods g : set){
    118             System.out.println(g);
    119         }
    120         
    121         
    122     }
    123     
    124     //使用上泛型以后的定制排序
    125     @Test
    126     public void test5(){
    127         
    128         Comparator<Goods> com = new Comparator<Goods>(){
    129 
    130             @Override
    131             public int compare(Goods o1, Goods o2) {
    132                 
    133                 return o1.getGoodsName().compareTo(o2.getGoodsName());
    134                 
    135             }
    136             
    137         };
    138         
    139         
    140         TreeSet<Goods> set = new TreeSet<>(com);
    141         
    142         Goods g1 = new Goods("eggs", 10.5);
    143         Goods g2 = new Goods("banana", 7.5);
    144         Goods g3 = new Goods("apple", 2.5);
    145         Goods g4 = new Goods("orange", 4.3);
    146         
    147         
    148         set.add(g1);
    149         set.add(g2);
    150         set.add(g3);
    151         set.add(g4);
    152         
    153         for(Goods g : set){
    154             System.out.println(g);
    155         }
    156         
    157         
    158     }
    159 }

     2.自定义泛型类

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 /*
     5  * 自定义泛型类
     6  * 
     7  */
     8 public class Order<T> {
     9 
    10     //在类的内部的属性、方法、构造器等中,就可以使用类的泛型
    11     
    12     String orderName;
    13     int orderId;
    14     T orderT;
    15     T[] arr;
    16     
    17     public Order(){
    18 //        arr = new T[10];//错误的
    19         arr = (T[]) new Object[10];
    20     }
    21     
    22     public Order(T orderT){
    23         this.orderT = orderT;
    24     }
    25     
    26     //如下的两个方法不是泛型方法!
    27     public String toString(){
    28         return "Order[orderName:" + orderName + ",orderId:" + orderId + ",orderT:" + orderT + "]"; 
    29     }
    30     
    31     
    32     public T getOrderT(){
    33         return orderT;
    34     }
    35     
    36     //静态方法中不能使用类的泛型
    37 //    public static T show(){
    38 //        System.out.println(orderT);
    39 //        return orderT;
    40 //    }
    41     
    42     //泛型方法
    43     //泛型方法所在的类,不一定是泛型类。换句话说,泛型方法与泛型类没有直接关系
    44     //泛型方法,根据需要可以声明为static的
    45     public static <E>  List<E> copyArrToList(E[] arr){
    46         
    47         List<E> list = new ArrayList<>();
    48         for(E e : arr){
    49             list.add(e);
    50         }
    51         
    52         return list;
    53         
    54     }
    55     
    56 }

     1 import java.util.List;
     2 
     3 import org.junit.Test;
     4 
     5 public class GenericTest1 {
     6     
     7     @Test
     8     public void test1(){
     9 //        Goods<Integer> goods1 = new Goods<>();
    10         
    11         //实例化泛型类时,没有指明类的泛型。则此时认为泛型的类型为Object
    12         Order order = new Order();
    13         order.orderT = "AA";
    14         
    15         //实例化泛型类时,指明了类的泛型,进而类中凡是使用类的泛型的位置,都变化为具体的类的泛型。
    16         Order<Integer> order1 = new Order<Integer>();
    17         order1.orderT = 123;
    18         Integer t = order1.getOrderT();
    19         
    20     }
    21     
    22     /*
    23      * 除了在实例化泛型类时,指明类的泛型之外。还可以提供泛型类的子类时,指明泛型的类型。比如:SubOrder1
    24      * 
    25      * 
    26      */
    27     @Test
    28     public void test2(){
    29         SubOrder1 sub1 = new SubOrder1();
    30         sub1.orderT = "AA";
    31         
    32         SubOrder2<Integer> sub2 = new SubOrder2<>();
    33         Integer orderT = sub2.getOrderT();
    34     }
    35     
    36     @Test
    37     public void test3(){
    38         Order<String> order = new Order<>();
    39         
    40         Integer[] arr = new Integer[]{1,2,3};
    41         
    42         List<Integer> list = order.copyArrToList(arr);
    43         
    44     }
    45 }
    //SubOrder1不是泛型类
    public class SubOrder1 extends Order<String>{
    
    }
    1 //SubOrder2仍然是一个泛型类
    2 public class SubOrder2<T> extends Order<T>{
    3 
    4 }

    3.自定义泛型类的补充说明

     

     

     

     

    4.泛型方法

     

    5.泛型在继承上的体现

     

     

     

     

    6.通配符的使用

     

    7.有限制条件的通配符

     

     

     

  • 相关阅读:
    【Jquery系列】详解Jquery对象和Dom对象
    将博客搬至CSDN
    【工具篇】.NET开发常用工具
    【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查
    【SqlServer】【问题收集】必须声明标量变量
    【SqlServer】【问题收集】删除同一张表中完全相同的记录
    【SqlServer】【问题收集】阻止保存要求重新创建表的更改
    Java多线程编程中Future模式的详解<转>
    Java后端,应该日常翻看的中文技术网站<转>
    PostgreSql 函数
  • 原文地址:https://www.cnblogs.com/-xuewuzhijing-/p/13195014.html
Copyright © 2020-2023  润新知