这两种方法有什么区别?泛型方法与非泛型方法的区别
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