Java - 使用&#34; <! - ?扩展接口 - >&#34; vs仅限界面

时间:2016-10-19 06:25:30

标签: java generics interface

我看过一些代码如下

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
}

2 个答案:

答案 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>的方法 - 你必须先以某种方式转换列表。确切地说:你会做一个“硬”演员;因为“转换”通用列表没有意义,因为类型擦除无论如何都会在运行时启动!

通过在方法定义上使用通配符,您可以允许传递使用扩展类型的“实际”子类的列表;不需要丑陋的演员阵容。