我看过一些代码如下
public interface IBean {
}
及其在某些地方的用法
public void persist(List<? extends IBean> beansList) {
}
然而,使用以下代码
可以实现同样的效果public void persist(List<IBean> beansList) {
}
那么两种方法之间的区别是什么,两者都是必须继承IBean
接口的对象?
以下是bean类
public class Category implement IBean {
//related fields
}
public class Product implement IBean {
//related fields
}
答案 0 :(得分:4)
您可以将List<Category>
传递给public void persist(List<? extends IBean> beansList)
,但无法将List<Category>
传递给public void persist(List<IBean> beansList)
。
另一方面,您可以将List<IBean>
传递给两种方法。
答案 1 :(得分:3)
原因是泛型是不变的。例如,这意味着您无法使用List<Integer>
,而List<Number>
是预期的。
但是当转向通配符时,你可以规避这种限制。因此,当你真的有List<Product>
时,你将无法将其传递给期望List<IBean>
的方法 - 你必须先以某种方式转换列表。确切地说:你会做一个“硬”演员;因为“转换”通用列表没有意义,因为类型擦除无论如何都会在运行时启动!
通过在方法定义上使用通配符,您可以允许传递使用扩展类型的“实际”子类的列表;不需要丑陋的演员阵容。