使用object和泛型做形参,是为了能接收更多类型的对象,保证代码健壮性。其实使用泛型的地方可以使用object,使用object的地方也可以使用泛型,所以在这里说明二者区别。
关于object类型
Object是所有类型的父类,比较宽泛。
-
object类型可以来引用任何类型的实例
-
object类型可以存储任何类型的值
-
可以定义object类型的参数
-
可以把object作为返回类型
泛型是Object的精确化
任何使用Object的地方都可以使用泛型
将一个对象存入Java集合中后,集合就会 “忘记” 这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了 Object 类型(其运行时类型没变)。
Java 集合之所以被设计成这样,是因为集合的设计者不知道我们会用集合来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要求具有很好的通用性。
但这样做带来如下两个问题:
-
集合对元素类型没有任何限制,这样可能引发一些问题。例如,想创建一个只能保存 Dog 对象的集合,但程序也可以轻易地将 Cat 对象存进去,可能引发异常。
-
将对象存入集合后,集合丢失了对象的状态信息,只知道它是 Object,因此取出集合元素后通常还需要进行强制类型转换。这种强制类型转换既增加了编程的复杂度,也可能引发ClassCastException 异常。
为了解决这个问题,Java提供了泛型。
二者使用场景
调用Object时要进行一个强转,将Object类型转换为接受值类型。
泛型声明:
public <T> T method(T t){
return t;
}
泛型引用:
String message= method("String类型参数");
Object声明:
public Object method(Object obj){
return obj;
}
Object引用:
String message= (String)method("String类型参数");
栗子:
定义一个类,这个类里的方法只能QueryBO的子类使用,并且当这个三个布尔类型都为true的时候,返回ture,否则,返回false。
要实现这样的类,应该使用泛型。
从数据库查询出来的一份数据 ——> 特点:已知需要查询内容的具体对象,且可以确定这些类型、属性等。
此时就没必要使用泛型了,泛型是在其有多种子类、且子类类型不同时使用的。
使用总结:
-
当数据类型很多且不确定要使用什么类型对象时,可以使用Object;
当数据类型很多且能确定使用什么类型对象时,最好使用泛型,可以在操作数据时把类型进行统一。 -
使用Object类型在获取数据时,无法使用其特有的行为,比如不能调用属性方法;
当后面会使用到对象其属性时,应该用泛型。
二者比较(泛型的好处)
-
使用obiect作为形参当需要进行类型强制转换时,编译期不会检查类型是否安全,运行期才会检查;使用泛型可以把运行时期的问题提前到编译期间。
-
泛型写法的指定保证了代码的健壮性,避免了强制类型转换的风险。