泛型就是把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型,那在实际中java方法里怎么装泛型?下面来我们就来给大家讲解一下java泛型的相关内容。
在类上定义的泛型,在方法中也可以使用,我们可能就仅仅在某一个方法上需要使用泛型,外界仅仅是关心该方法,不关心类其他的属性…这样的话,我们在整个类上定义泛型,未免就有些大题小作了。
定义泛型方法….泛型是先定义后使用的
//定义泛型方法.. publicvoid show(T t) { System.out.println(t); }
测试代码:
用户传递进来的是什么类型,返回值就是什么类型了
public static void main(String[] args) { //创建对象 ObjectTool tool = new ObjectTool(); //调用方法,传入的参数是什么类型,返回值就是什么类型 tool.show("hello"); tool.show(12); tool.show(12.5); }
以集合来举例,使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合,如整型集合类,浮点型集合类,字符串集合类,我们可以定义一个集合来存放整型、浮点型,字符串型数据,而这并不是最重要的,因为我们只要把底层存储设置了Object即可,添加的数据全部都可向上转型为Object。 更重要的是我们可以通过规则按照自己的想法控制存储的数据类型。
使用泛型有什么好处?
我们以ArrayList为例,假如我们要将本月截至今天的日期放到ArrayList中,如果我们不使用泛型,此时我们定义一个ArrayList.
List monthDays = new ArrayList();
我们向其中加入1号到4号日期
public static List addMonthDays() { List monthDays = new ArrayList(); monthDays.add(LocalDate.now() .withDayOfMonth(1)); monthDays.add(LocalDate.now() .withDayOfMonth(2)); monthDays.add(LocalDate.now() .withDayOfMonth(3)); monthDays.add(new Date()); return monthDays; }
这样有没有问题?大家也看出来了,当然有,虽然都可以表示日期,但却用了Date,LocalDate,我们调用方法直接打印出来,就是这样
public static void main(String[] args) { List monthDays = addMonthDays(); for (Object day: monthDays) { System.out.println(day); } }
2019-08-01 2019-08-02 2019-08-03 Sun Aug 04 10:27:10 CST 2019
我们肯定不想要这样的结果,我们想要的是
2019-08-01 2019-08-02 2019-08-03 2019-08-04
如果存储的元素类型只是这两种(假如我们知道),这个时候我们就手动判断一下
public static void main(String[] args) { List monthDays = addMonthDays(); for (Object day: monthDays) { if (day instanceof Date) { Date date = (Date) day; System.out.println(LocalDate.of(date.getYear(), date.getMonth(), date.getDay())); } else { System.out.println(day); } } }
这个时候我们就可以达成上述目的了,但大家也知道,这种写法问题问题很大
我们无法控制存储的元素到底是否和日期相关,如我们存储了“1”,65536等非日期,定义的方法也不会报错,但在调用进行类型转换的时候必然会报错;
我们不知道集合中到底存储了哪些类型的元素,比如还有“2019/08/04”这种日期字符串、java.sql.Date这种类型呢,我们很难保证可以穷尽;
代码过于复杂,太难维护;
这时泛型就提供了很好的解决方案,从源头上就制定好规则,只能添加LocalDate类型,那么上述的问题就都得以解决了。
public static ListaddFormatMonthDays() { ListmonthDays = new ArrayList < > (); monthDays.add(LocalDate.now() .withDayOfMonth(1)); monthDays.add(LocalDate.now() .withDayOfMonth(2)); monthDays.add(LocalDate.now() .withDayOfMonth(3)); monthDays.add(new Date()); //这个代码在编译期间就无法通过了 return monthDays; }
不仅提高了代码的可读性,一眼即可看出我们存储的是LocalDate类型。同时编译器也可很好的利用该信息,编译期间就可进行类型检查,保证了安全性,在get的时候,无需进行强制类型转换。
其实简单点的理解就是通过泛型抽象数据类型后,你的代码可以重复使用并且易于维护。最后大家如果想要了解更多java常见问题知识,敬请关注奇Q工具网。
推荐阅读: