package cn.learn.collection.FanXing; /* 泛型的上限限定,格式? extend E 代表使用的泛型只能是E类型的子类/本身 泛型的下限限定,格式? super E 代表使用的泛型只能是E类型的父类/本身 */ public class GenericControl { }
package cn.learn.collection.FanXing; /* 定义一个含有泛型的接口 */ public interface GenericInterface<I>{ public abstract void method(I i); }
package cn.learn.collection.FanXing; /* 泛型接口 第一种使用方式:定义接口的实现类,实现接口并指定接口的泛型 */ public class GenericInterfaceImpl implements GenericInterface<String> { @Override public void method(String s) { System.out.println(s); } }
package cn.learn.collection.FanXing; /* 泛型接口 第二种使用方式:接口使用的是什么类型,实现类就是什么类型,类跟着接口走 */ public class GenericInterfaceImpl2<I> implements GenericInterface<I> { @Override public void method(I i) { System.out.println(i); } }
package cn.learn.collection.FanXing; /* 定义一个含有泛型的方法: 格式: 修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)){ //方法体 } 注:传递什么类型的参数,泛型就是什么类型 */ public class GenericMethod { //定义一个泛型方法 public <M> void method(M m){ System.out.println(m); } //创建一个含有泛型的静态方法,属于这个类 public static <M> void staticMethod(M m) { System.out.println(m); } }
package cn.learn.collection.FanXing; /* 定义一个含有泛型的类 泛型是一个未知的数据类型,当不确定数据类型时,可以使用泛型,用于接收任意数据 */ public class GenericClass<E> { private E name; public E getName() { return name; } public void setName(E name) { this.name = name; } }
1 package cn.learn.collection.FanXing; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 /* 7 泛型:E -一种未知的数据类型,例如在集合中,可以放入任何元素,对象也行 8 -变量,可以用来接受数据类型 9 */ 10 public class FanXing { 11 public static void main(String[] args) { 12 //如下没有规范指定的数据类型,可以存放任意数据类型,每个元素时Object型 13 ArrayList cl = new ArrayList(); //var cl = new ArrayList 14 cl.add(2); //c1.add(int 2) 15 cl.add("skkkk"); 16 //此时遍历不适合增强型for,但可以用迭代器 17 System.out.println(cl);//[2,skkkk] 18 //迭代器遍历 19 Iterator iter=cl.iterator(); 20 while(iter.hasNext()){ 21 System.out.println(iter.next()); 22 } 23 /* 24 没有数据类型的集合 25 优点:可以添加任意数据类型 26 缺点:在使用其他方法是容易报异常 27 */ 28 //如下得到字符串,返回的是一个Object类型,若想使用length方法,由于多态,必须向下转型 29 int i =((String)cl.get(1)).length(); 30 System.out.println(i); //5 31 32 33 //使用自己定义的泛型类 34 GenericClass text= new GenericClass(); 35 text.setName("萝卜头"); //添加的是Object类型,所以不能直接用字符串的length方法 36 System.out.println(((String)text.getName()).length()); //3 37 38 //使用自己定义的泛型类,接收元素为Integer 39 GenericClass<Integer> gite = new GenericClass<>(); 40 //自动装箱 41 gite.setName(1); 42 //返回的是一个integer 43 Integer num = gite.getName(); 44 System.out.println(num); //1 45 46 //将自己写的类作为E 47 ArrayList<GenericClass> gen= new ArrayList<>(); 48 gen.add(text); 49 System.out.println(gen.get(0).getName()); //萝卜头 50 51 52 //调用泛型方法 53 GenericMethod name=new GenericMethod(); 54 name.method("传递任意类型数据"); 55 //调用静态泛型方法 56 GenericMethod.staticMethod("静态泛型方法调用了"); 57 58 //测试泛型接口的实现类 59 //第一种方法:指定了实现类的类型 60 GenericInterfaceImpl gimpl = new GenericInterfaceImpl(); 61 gimpl.method("泛型指定实现类实现"); 62 63 //第二种方法:未指定实现类的类型 64 GenericInterfaceImpl2 gimpl2 = new GenericInterfaceImpl2(); 65 gimpl2.method("sdas"); //传递的是一个Object对象,不是字符串 66 //在这里指定泛型的数据类型 67 GenericInterfaceImpl2<Integer> gimpl3 = new GenericInterfaceImpl2<>(); 68 gimpl2.method(2); //传递的是一个int 69 System.out.println(gimpl3); //2 70 71 72 73 } 74 }
package cn.learn.collection.FanXing; import java.util.ArrayList; import java.util.Iterator; /* 泛型的通配符: ?:代表任意的数据类型 使用方式: 不能创建对象使用,定义的时候 只能作为方法的参数,传递的使用 */ public class GenericWildcard { public static void main(String[] args) { ArrayList<Integer> list01= new ArrayList<>(); list01.add(1); list01.add(2); list01.add(3); ArrayList<String> list02= new ArrayList<>(); list02.add("ni"); list02.add("ya"); list02.add("hao"); //任意类型的遍历实现 traverse(list01); traverse(list02); } /* 定义一个方法来进行遍历未知类型的集合,利用通配符? */ public static void traverse(ArrayList<?> list){ for (int i = 0; i < list.size() ; i++) { System.out.println("for循环遍历"+list.get(i)); } //使用迭代器遍历集合,Iterator for (Iterator<?> it=list.iterator();it.hasNext();){ System.out.println("迭代器遍历"+it.next()); } } }