案例1-泛型类:
1 /** 2 * 1.分析如下泛型定义是否正确? 3 * 1)class A<Parameter>{} 正确 4 * 2)interface B<Param,Result>{} 正确 5 * 3)class C{ 6 * public <T>void doMethod(T t){} 正确 7 * } 8 * 4)class D<T>{ //不正确(类上泛型不作用于静态方法) 9 * static void doMethod(T t){} 10 * } 11 * 2.分析如下代码,检查代码是否有问题? 12 * class A<T>{} 13 * class B extends A<T>{} 不正确 14 * class C<T> extends A<T>{}正确 15 * class E extends A<String>{}正确 16 * 3.分析如下代码,检查代码是否有问题? 17 * 18 * interface A<K,V>{} 19 * class B implements A<K,V>{} 不正确 20 * class C<K,V> implements A<K,V>{} 正确 21 * class D implements A<String,Object>{}正确 22 * class E<K> implments A<K,Object>{}正确 23 * 24 * 4.分析如下代码,检查代码是否有问题? 25 * List<Object> list=new ArrayList<String>();不正确 26 * List<String> list=new ArrayList<Object>();不正确 27 * List<? extends Object> list=new ArrayList<String>();正确 28 * List<? super String> list=new ArrayList<Object>();正确 29 */ 30 //泛型接口(接口定义时使用泛型用于约束方法参数类型,返回值类型) 31 interface Container<T>{ 32 void add(T t); 33 T get(int i); 34 int size(); 35 } 36 //泛型类,当使用一个类实现泛型接口对象时 37 //说明:类定义时要么声明为泛型类,要么为接口传入具体类型 38 abstract class AbsContainer<T> implements Container<T>{ 39 @Override 40 public int size() { 41 return 0; 42 } 43 } 44 class ArrayContainer extends AbsContainer<Integer>{ 45 private Object[] array; 46 public ArrayContainer() { 47 array=new Object[16]; 48 } 49 @Override 50 public void add(Integer t) { 51 //.... 52 } 53 @Override 54 public Integer get(int i) { 55 //... 56 return null; 57 } 58 } 59 public class TestGeneric01 { 60 61 public static void main(String[] args) { 62 ArrayContainer c=new ArrayContainer(); 63 c.add(100); 64 } 65 }
案例2-泛型接口:
1 package com.company.java.generic; 2 3 interface Task<Param,Result>{ 4 Result execute(Param param); 5 } 6 class IntegerConvertTask implements Task<String,Integer>{ 7 @Override 8 public Integer execute(String param) { 9 return Integer.valueOf(param); 10 } 11 } 12 public class TestGeneric02 { 13 public static void main(String[] args) { 14 Task<String,Integer> task= 15 new IntegerConvertTask (); 16 Integer a=task.execute("1000"); 17 System.out.println(a); 18 19 } 20 }
案例3-泛型方法:
1 package com.company.java.generic; 2 3 import java.util.Collection; 4 import java.util.Date; 5 import java.util.List; 6 7 /** 8 * 泛型方法应用 9 * 特点:修饰符 <泛型>返回值类型 方法名(参数列表) 10 * 11 */ 12 class ObjectFactory{ 13 //泛型方法 14 public <T>T newInstance(Class<T> cls)throws Exception { 15 return cls.newInstance(); 16 } 17 //泛型方法 18 public <T>boolean isCollection(Class<T> cls) { 19 return Collection.class.isAssignableFrom(cls); 20 }//isAssignableFrom()方法是判断是否为某个类的父类,用法: 父类.class.isAssignableFrom(子类.class) 21 } 22 class ContainerUtils{ 23 public static <E>void sort(List<E> list) {} 24 } 25 public class TestGeneric03 { 26 public static void main(String[] args) 27 throws Exception{ 28 ObjectFactory of=new ObjectFactory(); 29 Date date=of.newInstance(Date.class); 30 System.out.println(date); 31 32 boolean flag=of.isCollection(List.class); 33 System.out.println(flag); 34 35 } 36 }
案例4-限定通配符:
1 package com.company.java.generic; 2 3 import java.util.ArrayList; 4 import java.util.HashSet; 5 import java.util.List; 6 import java.util.Set; 7 /** 8 * 限定通配符应用:方法参数或返回值 9 */ 10 class PrintUtil{ 11 //上界限定通配符 12 public static void doPrint( 13 List<? extends CharSequence> list) { 14 System.out.println(list); 15 } 16 //下界限定通配符 17 public static void doPrint( 18 Set<? super Integer> set) { 19 System.out.println(set); 20 } 21 } 22 public class TestGeneric04 { 23 public static void main(String[] args) 24 throws Exception{ 25 Class<String> c1=String.class; 26 //"?"在这里表示通配符,代表一种实际参数 27 Class<?> c2= 28 Class.forName("java.lang.Object"); 29 //List<?> list=new ArrayList<?>(); 错 30 //如何对?的值进行约束呢? 31 List<String> list1=new ArrayList<String>(); 32 list1.add("A"); 33 PrintUtil.doPrint(list1); 34 Set<Integer> list2=new HashSet<Integer>(); 35 list2.add(2); 36 PrintUtil.doPrint(list2); 37 38 Set<Number> list3=new HashSet<Number>(); 39 list3.add(200); 40 PrintUtil.doPrint(list3); 41 } 42 }
案例5-泛型擦除:
1 package com.company.java.generic; 2 import java.lang.reflect.Method; 3 import java.util.ArrayList; 4 import java.util.List; 5 /** 6 * 案例分析:演示泛型类型擦除 7 * @author Administrator 8 */ 9 public class TestGeneric05 { 10 public static void main(String[] args) 11 throws Exception{ 12 List<String> list=new ArrayList<>(); 13 list.add("A"); 14 //list.add(200); 15 //list.add(0, 300); 16 //通过反射技术在运行时将200这个整数存储到集合 17 //1.获取list集合的字节码对象 18 Class<?> cls=list.getClass(); 19 //2.基于字节码对象获取方法对象 20 Method method= 21 //cls.getMethod("add", Object.class);//Object.class表示往集合中存放的元素类型 22 cls.getMethod("add",int.class,Object.class);//int.class表示给集合的int位置添加元素,Object.class表示往集合中存放的元素类型 23 //3.执行list对象add方法对象 24 //method.invoke(list,200); 25 method.invoke(list,0,300); 26 System.out.println(list); 27 } 28 }
浙公网安备 33010602011771号