2014-03-01 150 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>作为参数。