Java泛型学习-20170820
来源:互联网 发布:随机抽奖姓名软件 编辑:程序博客网 时间:2024/06/07 02:42
Java泛型学习系列文章:
Java泛型学习-20170816
http://blog.csdn.net/clandellen/article/details/77219824
Java泛型学习-20170817
http://blog.csdn.net/clandellen/article/details/77285616
Java泛型学习-20170818
http://blog.csdn.net/clandellen/article/details/77351555
Java泛型学习-20170819
http://blog.csdn.net/clandellen/article/details/77394687
前面四篇文章已经将Java的泛型基本讲解完了,本篇文章将会来几个实例进行泛型使用的练习,让你熟练应用泛型的开发工作:
1.前篇文章工厂例子正确的泛型编程
正确代码如下:
public class JianCe<T extends ChangPing> { public boolean isHeGe(T t){ String name = t.getChangPingName(); System.out.println(name); //通过名字从而读取对应的数据库的检测数据 double[][] datas = getSQLData(name);//datas[0]-->重量的检测数据,datas[1]-->长度的检测数据 System.out.println(datas[0][0]+"kg<"+t.weight+"kg<"+datas[0][1]+"kg"); System.out.println(datas[1][0]+"cm<"+t.length+"cm<"+datas[1][1]+"cm"); if((t.getWeight()>datas[0][0]&&t.getWeight()<datas[0][1]) &&(t.getLength()>datas[1][0]&&t.getLength()<datas[1][1])){ System.out.println("产品合格!"); }else{ System.out.println("产品不合格!"); } return false; } public static double[][] getSQLData(String name){ //这里模拟的数据库读取数据的过程 double[][] datas = new double[2][2];//datas[0]存放重量合格检测的数据,datas[1]存放长度合格检测的数据 if(name.equals("斧头")){ datas[0][0] = 4.5; datas[0][1] = 5; datas[1][0] = 46; datas[1][1] = 48; }else if(name.equals("剪刀")){ datas[0][0] = 0.15; datas[0][1] = 0.2; datas[1][0] = 10; datas[1][1] = 12; }else if(name.equals("铁锤")){ datas[0][0] = 5; datas[0][1] = 8; datas[1][0] = 50; datas[1][1] = 52; } return datas; } public static void main(String[] args){ JianCe<ChangPing> jianCe = new JianCe<ChangPing>(); List<ChangPing> changPingList = new ArrayList<ChangPing>(); changPingList.add(new FuTou(47,4.8));//合格 changPingList.add(new JianDao(11,0.17));//合格 changPingList.add(new TieChui(51,7));//合格 changPingList.add(new FuTou(22,33.2));//不合格 changPingList.add(new TieChui(22,33.2));//不合格 changPingList.add(new JianDao(22,33.2));//不合格 changPingList.add(new JianDao(22,33.2));//不合格 changPingList.add(new FuTou(22,33.2));//不合格 for(ChangPing changPing:changPingList){ System.out.println("*******************"); jianCe.isHeGe(changPing); System.out.println("*******************\n"); } }}class FuTou extends ChangPing{ public final String name = "斧头"; public FuTou(int length,double weight){ this.length = length; this.weight = weight; } @Override public String getChangPingName() { return name; }}//斧头类class JianDao extends ChangPing{ public final String name = "剪刀"; public JianDao(int length,double weight){ this.length = length; this.weight = weight; } @Override public String getChangPingName() { return name; }}//剪刀类class TieChui extends ChangPing{ public final String name = "铁锤"; public TieChui(int length,double weight){ this.length = length; this.weight = weight; } @Override public String getChangPingName() { return name; }}//铁锤类abstract class ChangPing{ int length = 0;//长度 double weight = 0;//重量 public int getLength() { return length; } public void setLength(int length) { this.length = length; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } abstract String getChangPingName();}
2.通过反射和泛型来对任意ArrayList进行规格排序,为了降低复杂程度,比较的属性类型为基本数据类型(Java高手)
完成这个题目需要一定的反射知识。
//arrayList 要排序的集合 //sortShuXing 排序需要的对应的属性的名字 //shuXingType 排序需要的对应的属性的类型public static <T> ArrayList<T> sortAnyArrayList(ArrayList<T> arrayList,String sortShuXing,String shuXingType){ if(arrayList.size()==0) { return arrayList; } Field byteField1 = null; try { byteField1 = arrayList.get(0).getClass().getDeclaredField(sortShuXing); byteField1.setAccessible(true);//取得访问权限 } catch (NoSuchFieldException | SecurityException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } for(int i=0;i<arrayList.size()-1;i++) { for(int j=i+1;j<arrayList.size();j++) { try { switch (shuXingType) { case "byte": case "short": case "int": case "long": case "char": long b1 = 0; long b2 = 0; b1 = byteField1.getLong(arrayList.get(i)); b2 = byteField1.getLong(arrayList.get(j)); if(b1>=b2) { T t = arrayList.get(i); arrayList.set(i, arrayList.get(j)); arrayList.set(j, t); } break; case "float": case "double": double d1 = 0; double d2 = 0; d1 = byteField1.getDouble(arrayList.get(i)); d2 = byteField1.getDouble(arrayList.get(j)); if(d1>=d2) { T t = arrayList.get(i); arrayList.set(i, arrayList.get(j)); arrayList.set(j, t); } break; case "String": //这里定义String的排序规则,可以按照字典排序 String s1 = ""; String s2 = ""; s1 = (String)byteField1.get(arrayList.get(i)); s2 = (String)byteField1.get(arrayList.get(j)); System.out.println(s1+":"+s2); //这里对String的排序请按照自己的排序规则来写 break; } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return arrayList;}
3.请写一个方法,这个方法可以根据传入的int值获取对应的类型,比如:1–>String,2–>Integer,3–>Boolean,4–>Character,5–>Double
public static <T> T getTrueClass(int i){ //1-->String,2-->Integer,3-->Boolean,4-->Character,5-->Double T t = null; if( i == 1){ // t = (T)new String("1"); }else if(i == 2){ t = (T)new Integer(2); }else if(i == 3){ t = (T)new boolean(true); }else if(i == 4){ t =(T)new Character('a'); }else if(i == 5){ t = (T)new Double(5.0); } return t;}
4.查询的多功能:有这么一个数组,当你查询这个数组时,存在两种行为,第1种,只需要反馈一个boolean值代表是否存在该查询的数值,第2种,反馈该查询的数值所有的存在的位置,使用泛型如何设计呢?
public class MyClass { public static <T> T getMessage(int[] ints, int xingWeiMode, int serachInt){ T t = null; if(xingWeiMode == 1){ t = (T)new Boolean(false); //行为1 for(int i=0;i<ints.length;i++){ if(serachInt == ints[i]){ t = (T)new Boolean(true); break; } } }else if(xingWeiMode == 2){ t = (T)new ArrayList<Integer>(); ArrayList<Integer> arrayList = (ArrayList<Integer>)t; //行为2 for(int i=0;i<ints.length;i++){ if(ints[i] == serachInt){ arrayList.add(i); } } }else{ //错误的行为码 System.out.println("行为码错误,要么是1要么是2,不能为其他"); } return t; } public static void main(String[] args){ int[] ints = {2,4,6,8,10,12,14,16,18,20,2,2,2,4,4,5,6,7}; boolean b = getMessage(ints,1,4); System.out.println("是否存在元素4:"+b); ArrayList<Integer> arrayList = getMessage(ints,2,2); System.out.println("数组中元素4的位置:"); for(int i:arrayList){ System.out.print(" "+(i+1)); } }}
5.通过传入的Class返回对应的类型,比如:传入String.class,那么返回类型为String,传入Student.class,那么返回类型为Student。可别小看这个例子,很多框架都有用到这个例子。
//class1是对应的Class //Class[]对应的是构造器的参数列表 //Objects[]对应着构造器的参数列表传递的值 public static <T> T getTrueClass(Class class1,Class[] classs,Object[] objs) { Object obj = null; Constructor con = null; try { if(objs!=null) { con = class1.getDeclaredConstructor(classs); con.setAccessible(true); obj = con.newInstance(objs); }else { con = class1.getDeclaredConstructor(); con.setAccessible(true); obj = con.newInstance(); } } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T)obj;}public static void main(String[] args) { System.out.println(getTrueClass(Student.class, null, null).getClass().getName()); Student s = getTrueClass(Student.class, new Class[] {int.class,String.class}, new Object[] {23,"ellen"}); System.out.println("姓名:"+s.name+",年龄:"+s.age);}class Student { int age; String name; public Student(int age,String name) { this.age = age; this.name = name; } public Student(){}}
阅读全文
3 0
- Java泛型学习-20170820
- JAVA泛型学习
- java泛型学习
- java泛型学习
- Java泛型学习
- java 泛型学习
- java泛型学习
- java-泛型学习
- java泛型学习
- java 泛型学习
- Java泛型学习
- Java泛型学习
- 【Java学习】泛型接口学习
- 【Java学习】Java泛型知识点总结
- [转]JAVA泛型学习
- Java泛型学习笔记
- java学习之泛型
- java泛型学习笔记
- Javascript—typeof,null和undefined
- [C++] Vector对象的合法定义
- Struts2的学习之路(四)配置文件加载顺序
- nyoj 20 吝啬的国度
- 使用notify_url异步处理小程序支付结果
- Java泛型学习-20170820
- 装饰模式
- case,when,then,else,end的mysql语句用法与说明
- myeclipse开发工具代码注释配置
- poj1144 求图的割点--模板
- Java BigDecimal详解
- 面试题总结之快速排序
- 对称秘钥与公共秘钥的区别
- HDU2089-不要62