2014-03-01 151 views
3

這兩種方法有什麼區別?泛型方法與非泛型方法的區別

public <T extends Serializable, Y extends List<T>> void foo(Y y, T t); 

public void foo(Serializable ser, List<Serializable> list); 
+0

第一個是鍵入。因此,你不需要施加結果。例如,'Y y2 = foo(y1,t1); '不適用於第二個例子。你將不得不做'Y y2 =(Y)foo(y1,t1); ' –

+0

@ArnaudDenoyelle方法是'void'。 –

+0

它允許您使用相同的基類/方法來管理多個對象。一個很好的例子就是你在例子中使用的Java內置接口'List '。 – Flawyte

回答

3
public <T extends Serializable, Y extends List<T>> void foo(Y y, T t); 

指定這個功能力的仿製藥究竟什麼類型T是,它必須是正好在這兩個參數是相同的。子類T是不允許的,它必須是類型。編譯器將不允許以其他方式。

public void foo(Serializable ser, List<Serializable> list); 

在這個非一般的功能外,還有就是參數類型沒有關係,除了他們都是Serializable。這允許ser任何類型的Serializable,並在list元素爲任何類型的Serializable。他們可能是相同的類型,他們可能不是。編譯器無關緊要。

多一點對可能讀這篇文章的任何新手信息:

泛型只在源代碼中存在。代碼編譯後它們不存在。這就是所謂的「類型擦除」:

https://www.google.com/search?q=type+erasure+java

這擦除這樣做預泛型代碼可以使用泛型代碼進行互操作。因此,在泛型引入之前存在的代碼不會被改爲。鼓勵新代碼始終使用泛型。

5

第一種可與List<String>(例如)作爲參數來調用。第二個不能,因爲List<String>不是List<Serializable>

第二個可以用作爲第一個參數的Integer和作爲第二個參數的List<Serializable>來調用。但是,如果另一個參數是Integer,則第一個參數只接受List<Integer>作爲參數。