当前位置: 首页 > news >正文

做与食品安全有关的网站wordpress liuweili

做与食品安全有关的网站,wordpress liuweili,长春网站建设制作,网站方案制作的培训什么是泛型泛型是提供给javac编译器使用的#xff0c;可以限定集合中的输入类型#xff0c;让编译器挡住源程序中的非法输入#xff0c;编译器编译带类型说明的集合时会去除掉”类型”信息#xff0c;是程序的运行效率不受影响#xff0c;对于参数化的泛型类型#xff0c… 什么是泛型泛型是提供给javac编译器使用的可以限定集合中的输入类型让编译器挡住源程序中的非法输入编译器编译带类型说明的集合时会去除掉”类型”信息是程序的运行效率不受影响对于参数化的泛型类型getClass()方法返回值和原始类型完全一样。由于编译生成的字节码会擦除泛型的类型信息只要能跳过编译器就可以往某个泛型集合中加入其它类型的数据例如用反射得到集合然后再调用add()方法即可GenericDemo.javapublic class GenericDemo {public static void main(String[] args) {// 未使用泛型则可以添加任意Object类型的数据List noGrnerics new ArrayList();noGrnerics.add(1);noGrnerics.add(hello);noGrnerics.add(1L);noGrnerics.add(new GenericDomain(1L,Generic));// 由于没有使用泛型在取出数据时必须要知道某个位置上的某个数据的数据类型并加以强制转换否则要出错,除非用Object接收。Integer integer (Integer) noGrnerics.get(0);System.out.println(integer integer);// 由于不知道某个位置上的数据类型用Object接收Object objIndex1 noGrnerics.get(1);System.out.println(objIndex1 objIndex1);Object objeIndex3 noGrnerics.get(3);System.out.println(objeIndex3 objeIndex3);// 虽然可以通过类对象来知道类属性但是这样不是太麻烦了吗System.out.println(objeIndex3.getClass() objeIndex3.getClass());// 使用泛型ListString strs new ArrayList();strs.add(str1);strs.add(str2);strs.add(str3);// 因为指定了这个List中只能放置String类型的数据当这里放置其他类型的数据时就会报错因为不能装进去// 从某种角度上可以认为泛型解决了强制类型转换使数据特征更明显拥有一致性 // strs.add(1);String str strs.get(0);System.out.println(str str);}}绕过编译时泛型添加非泛型类型数据GenericDemo2.javapublic class GenericDemo2 {/*** 程序目标向一个ListString的泛型数组中添加Integer类型的数据* * param args*/public static void main(String[] args) {ListString strs new ArrayList();strs.add(str1);strs.add(str2);strs.add(str3);strs.add(str4);// 这里是添加不进去的因为指定了泛型类型且没有泛型擦除// strs.add(new Integer(1));System.out.println(Before add a Integer value : strs);// 通过泛型在运行时擦除的原理利用反射向泛型中添加Integer数据ClassListString clazz (ClassListString) strs.getClass();try {// 这里在利用反射获取add方法时如果参数类型指定为String.class// 则说明add方法为java.util.ArrayList.add(java.lang.String)// 而我们传入了一个Integer类型的数据则显然不能添加成功会抛出 java.lang.NoSuchMethodExceptionclazz.getDeclaredMethod(add, String.class).invoke(strs, new Integer(1));// 这里原因一样java.util.ArrayList.add(java.lang.Integer) 但是用的int// 请记住java是强类型语言,这里不存在自动装箱和拆箱clazz.getDeclaredMethod(add, Integer.class).invoke(strs, 2);// 这里也是不正确的因为ClassListString指定了放Stringclazz.getDeclaredMethod(add, Integer.class).invoke(strs, new Integer(4));//同上clazz.getDeclaredMethod(add, int.class).invoke(strs, 5);} catch (Exception e) {e.printStackTrace();} finally {//正确做法try {clazz.getDeclaredMethod(add, Object.class).invoke(strs, 3);System.out.println(strs strs);// 只有Object能行clazz.getDeclaredMethod(add, String.class).invoke(strs, 4);System.out.println(strs strs);} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException| NoSuchMethodException | SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println(After add a Integer value : strs);}}解释为什么只能用Object运行时会擦除泛型下面的代码清单就可以验证public class GenericTypeDemo {public static void main(String[] args) {// 这里的字节码类型为ArrayListListString strings new ArrayList();// 这里的字节码类型也为ArrayListListInteger integers new ArrayList();System.out.println(strings.getClass() strings.getClass());System.out.println(integers.getClass() integers.getClass());System.out.println(integers.getClass() strings.getClass() (integers.getClass() strings.getClass()));}}泛型中的通配符需求定义一个方法该方法用于打印出任意参数类型化的集合中的所有数据。public class GenericDemo3 {public static void main(String[] args) {// 需求定义一个方法该方法用于打印出任意参数类型化的集合中的所有数据。ListString strings new ArrayList();strings.add(a);strings.add(b);strings.add(c);strings.add(f); printCollectionElements(strings);printStringCollectionElements(strings);ListInteger integers new ArrayList();integers.add(1);integers.add(2);integers.add(3);integers.add(4);printCollectionElements(integers);// 这里就不能用了 // printStringCollectionElements(integers);}/*** 定义一个方法该方法用于打印出任意参数类型化的集合中的所有数据。* 这种是通配方法能够打印所有的其通配之处就在与??可以引用其他各种参数化的类型* param collection*/public static void printCollectionElements(Collection? collection) {collection.forEach(System.out::println);}/*** 打印String类型的集合数据由于制定了泛型类型为String则只能打印String类型的集合* param collection*/public static void printStringCollectionElements(CollectionString collection) {collection.forEach(System.out::println);}} 总结使用?通配符可以引用其他各种参数化的类型?通配符定义的变量主要用作引用可以调用与参数化无关的方法如size()不能调用与参数化有关的方法如add(E e)泛型中?的扩展限定通配符的上边界正确 List? extends Number x new ArrayListInteger();错误 List? extends Number x new ArrayListString();限定通配符的下边界正确 Vector? super Integer x new VectorNumber();错误 Vector? super Integer x new VectorByte();总结限定通配符总是包括自己转载于:https://www.cnblogs.com/homeword/p/7497121.html
http://www.sadfv.cn/news/1606/

相关文章: