最近在讀jackson源碼的時候發現有段代碼返回類型寫的是<T> T,而我自己一般寫的是Object。上網搜了下這個語法糖,在stackoverflow上找到一個比較簡單易懂的解釋,搬運過來(https://stackoverflow.com/questions/5207115/java-generics-t-vs-object)
問題:下面2個方法的聲明有何不同
public Object doSomething(Object obj) {....} public <T> T doSomething(T t) {....}
答案:
單從上文2個方法聲明來說-沒有區別。無論是t 還是 obj,你都只能調用Object類型的參數和返回值。
但是基於上面2個方法,如果你有一個使用了泛型的類:
MyClass<Foo> my = new MyClass<Foo>(); Foo foo = new Foo();
就可以這么寫:
Foo newFoo = my.doSomething(foo);
但是如果是使用object的話,就得這么寫
Foo newFoo = (Foo) my.doSomething(foo);
由此可見,使用泛型,有2個好處:
1.不需要做強制類型轉換
2.編譯時更安全。如果使用Object類的話,你沒法保證返回的類型一定是Foo,也許是其它類型。這時你就會在運行時得到一個類型轉換異常(ClassCastException)