这两种方法有什么区别?
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
完成此擦除操作后,预泛型代码可以与泛型代码互操作。所以之前存在引入泛型不会代码必须被改变。鼓励新代码始终使用泛型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句