第08章 泛型

  1 /*****************
  2 ***第08章 泛型
  3 *******知识点:
  4 **************1.泛型定义
  5 **************2.泛型使用
  6 ******************2.1 普通泛型
  7 ******************2.2 类型通配符
  8 ******************2.3 受限泛型
  9 ******************2.4 泛型接口、类、方法
 10 ******************2.5 泛型数组
 11 ******************2.6 嵌套设置
 12 */
 13 import java.util.*;
 14 
 15 class Point<T>{       // 此处可以随便写标识符号,T是type的简称  
 16     private T var ; // var的类型由T指定,即:由外部指定  
 17     public T getVar(){  // 返回值的类型由外部决定  
 18         return var ;  
 19     }  
 20     public void setVar(T var){  // 设置的类型也由外部决定  
 21         this.var = var ;  
 22     }  
 23     public Point(T t){
 24         this.var = t;
 25     }
 26     public Point(){
 27         
 28     }
 29 }
 30 
 31 class PointKeyValue<K,V>{  // 此处指定了两个泛型类型  
 32     private K key;    // 此变量的类型由外部决定  
 33     private V value;  // 此变量的类型由外部决定
 34     public void setKey(K key){
 35         this.key = key;
 36     }
 37     public void setValue(V value){
 38         this.value = value;
 39     }
 40     public K getKey(){
 41         return key;
 42     }
 43     public V getValue(){
 44         return value;
 45     }
 46     
 47     public String toString(){
 48         return "{" + key + "," + value + "}";
 49     }
 50     public PointKeyValue(K k ,V v){
 51         this.key = k;
 52         this.value = v;
 53     }
 54     public PointKeyValue(){
 55         
 56     }
 57     
 58 }
 59 
 60 class PointInner<T,K,V>{
 61     private PointKeyValue p_PointKeyValue; // 接收两个泛型类型成员变量
 62     private Point p_Point;
 63     public PointInner(T t,K k,V v){
 64         this.p_Point = new Point(t);
 65         this.p_PointKeyValue = new PointKeyValue(k,v);
 66     }
 67     
 68     public String toString(){
 69         return "{" + p_Point.getVar() + ":" + p_PointKeyValue.getKey() + "," + p_PointKeyValue.getValue() + "}";
 70     }
 71 }
 72 
 73 public class test8{
 74     public static void main(String[] args){
 75         showDemo("泛型定义");
 76         testGenericsDefined();//演示泛型定义
 77         
 78         showDemo("泛型使用");
 79         testGenericsUse();//演示泛型使用
 80     }    
 81     
 82     /*
 83     *1.泛型定义
 84     */
 85     public static void testGenericsDefined(){
 86         /*List l_Gen = new ArrayList();
 87         l_Gen.add(1);
 88         l_Gen.add(2);
 89         l_Gen.add("aaaaa");//注意跟之前两个元素类型发生了变化,但不报错
 90         System.out.println("集合中元素有:"  + l_Gen);
 91         
 92         List<Integer> l_Gen1 = new ArrayList<Integer>();
 93         l_Gen1.add(1);
 94         l_Gen1.add(2);
 95         l_Gen1.add("aaaaa");//此行报错
 96         System.out.println("集合中元素有:"  + l_Gen1);*/
 97         
 98         //泛型:Java的参数化类型,即允许我们在创建集合时指定集合中元素的类型,且该集合只能存储指定类型的元素
 99         //使用范围:定义类、接口、方法是使用类型形参
100         //需注意:静态初始化块中是不允许的
101         
102     }
103     
104     /*
105     *2.泛型使用
106     */
107     public static void testGenericsUse(){
108         /**2.1 普通泛型**/
109         System.out.println("演示2.1 普通泛型===========");
110         Point<Integer> p_Generics = new Point<Integer>(); //里面的var类型为Integer
111         p_Generics.setVar(new Integer(1));//设置var
112         System.out.println("返回int值:" + (p_Generics.getVar().intValue()));//返回var
113         
114         PointKeyValue<Integer,String> p_KeyValue = new PointKeyValue<Integer,String>();
115         p_KeyValue.setKey(new Integer(10));
116         p_KeyValue.setValue("Ciade");
117         System.out.println("返回key:" + p_KeyValue.getKey());
118         System.out.println("返回value:" + p_KeyValue.getValue());
119         System.out.println("返回p_KeyValue:" + p_KeyValue.toString());
120         
121         /**2.2 类型通配符**/
122         System.out.println("演示2.2 类型通配符===========");
123         PointKeyValue<Integer,Double> p_PointKeyValue2 = new PointKeyValue<Integer,Double>();
124         PointKeyValue<String,String> p_PointKeyValue3 = new PointKeyValue<String,String>();
125         
126         p_PointKeyValue2.setKey(new Integer(2));
127         p_PointKeyValue2.setValue(new Double(2.2));
128         
129         p_PointKeyValue3.setKey("3");
130         p_PointKeyValue3.setValue("33333333");//注意区分p_PointKeyValue2和p_PointKeyValue3
131         
132         demoWildcardFun(p_PointKeyValue2);//调用通配符泛型演示方法
133         demoWildcardFun(p_PointKeyValue3);//调用通配符泛型演示方法
134         
135         /**2.3 受限泛型**/
136         System.out.println("演示2.3 受限泛型===========");
137         PointKeyValue<Integer,String> p_PointKeyValue4 = new PointKeyValue<Integer,String>();
138         
139         p_PointKeyValue4.setKey(new Integer(4));
140         p_PointKeyValue4.setValue("4444444");
141         
142         //demoLimitedFun(p_PointKeyValue2);//这行报错  类型受限
143         //demoLimitedFun(p_PointKeyValue3);//这行报错  类型受限
144         demoLimitedFun(p_PointKeyValue4);
145         
146         /**2.4 泛型接口、类、方法**/
147         //接口、类 、方法 参照上面的Point类和PointKeyValue类的定义使用
148         //温馨提示  当重载方法时,若重载的参数个数相同,参数类型和返回值不同时 可以使用泛型方法
149         
150         /**2.5 泛型数组**/
151         //Java 不支持泛型数组。也就是说
152         //List<String>[] ls = new ArrayList<String>[10];  //编译报错
153         //而你可以这样子
154         //List<String>[] ls = new ArrayList[10];
155         //不过不建议使用
156         
157         /**2.6 嵌套设置**/
158         System.out.println("演示2.6 嵌套设置===========");
159         PointInner<Integer,Integer,String> p_PointInner = new PointInner<Integer,Integer,String>
160                                                         (new Integer(7),new Integer(7),"777777777");
161         System.out.println("PointInner对象:" + p_PointInner);
162 
163     }
164     
165     /*
166     *  通配符泛型演示方法
167     */
168     public static void demoWildcardFun(PointKeyValue<?,?> temp){  // 可以接收任意的泛型对象 其中?为通配符
169         System.out.print("返回key:" + temp.getKey());
170         System.out.print("_返回value:" + temp.getValue());
171         System.out.println("_返回PointKeyValue对象:" + temp.toString());
172         
173     }
174     
175     /*
176     * 受限泛型演示方法
177     */
178     //第一个参数只能接收Number及其Number的子类,第二个参数只能接收String或Object类型的泛型
179     public static void demoLimitedFun(PointKeyValue<? extends Number,? super String> temp){
180         demoWildcardFun(temp);
181     }
182     
183     
184     /*
185     *    抽取打印演示函数  用于打印演示功能提示
186     */    
187     public static void showDemo(String demoStr){
188         System.out.println("演示:" + demoStr);
189     }
190 }
原文地址:https://www.cnblogs.com/ciade/p/4766432.html