最近开发需要实现对象的序列化和反序列化,在阅读jackson序列化和反序列化方面的源码的时候发现返回值写的是<T>,而我的自定义的方法写的的Object,引发了我的思考, Java中返回类型使用泛型T和Object到底有什么区别?还有到底那用哪个好?
举个栗子,问:下面两个方法有什么不同?
public Object doSomething(Object obj) {....}
public <T> T doSomething(T t) {....
答案:
单从上下两个方法的声明来看,确实没有什么区别,无论是T还是Object,你都只能调用Object类型的参数和返回值。但是基于上面2个方法,当你使用的是一个泛型类时:
MyClass<Foo> cl = new MyClass<Foo>();
Foo foo = new Foo();
就可以这样写:
Foo newFoo = cl.doSomething(foo);
但是如果你是使用Object的话,就的这样写:
Foo newFoo = (Foo)cl.doSomething(foo);
由此可见,使用泛型有两个好处:
1.返回类型不需要做强制类型转换。
2.编译时更安全。如果使用Object类的话,你没法保证返回的类型一定是Foo,也许是其它类型。这时你就会在运行时得到一个类型转换异常(ClassCastException)