這兩種方法有什麼區別?泛型方法與非泛型方法的區別
public <T extends Serializable, Y extends List<T>> void foo(Y y, T t);
和
public void foo(Serializable ser, List<Serializable> list);
這兩種方法有什麼區別?泛型方法與非泛型方法的區別
public <T extends Serializable, Y extends List<T>> void foo(Y y, T t);
和
public void foo(Serializable ser, List<Serializable> list);
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
這擦除這樣做預泛型代碼可以使用泛型代碼進行互操作。因此,在泛型引入之前存在的代碼不會被改爲。鼓勵新代碼始終使用泛型。
第一種可與List<String>
(例如)作爲參數來調用。第二個不能,因爲List<String>
不是List<Serializable>
。
第二個可以用作爲第一個參數的Integer
和作爲第二個參數的List<Serializable>
來調用。但是,如果另一個參數是Integer
,則第一個參數只接受List<Integer>
作爲參數。
第一個是鍵入。因此,你不需要施加結果。例如,'Y y2 = foo(y1,t1); '不適用於第二個例子。你將不得不做'Y y2 =(Y)foo(y1,t1); ' –
@ArnaudDenoyelle方法是'void'。 –
它允許您使用相同的基類/方法來管理多個對象。一個很好的例子就是你在例子中使用的Java內置接口'List'。 –
Flawyte