如何使用generics制作类型安全?

我上课了

public class ReportItem{ } 

和class级

 public abstract class Report implements Iterable{ private List<ReportItem > itemList; public void add(ReportItem item){ itemList.add(item); } //Some other staff } public class ConcreteReport extends Report{ //Some staff } 

事情是方法add(ReportItem)是不安全的,我可以提供的项目不与当前报告绑定,但与另一个绑定,编译器不会抱怨。

是否有可能以类型安全的方式编写方法add ,即我们只能作为参数传递ReportItem ,其中T是当前报告的类型。

我想你正在寻找以下内容。

 public abstract class Report> implements Iterable>{ private List> itemList; public void add(ReportItem item){ itemList.add(item); } //Some other stuff } public class ConcreteReport extends Report { //Some stuff } 

它的工作方式是:

  • 您希望使用从Report扩展的内容对ReportItem进行参数化
  • 您希望确保ReportItem都属于同一类型的Report

为了将ReportItemT参数绑定到从Report扩展的内容,您需要对Report本身进行参数化:

 public abstract class Report implements Iterable> 

您添加它需要从报表扩展的绑定

 public abstract class Report implements Iterable> 

但是您指定了原始报告类型的边界,这不起作用,因此您需要使用报告接收的类型参数提供Report ,即T

 public abstract class Report> implements Iterable> 

这样,您可以使用扩展的具体类型对List>进行参数化:

 public class ConcreteReport extends Report { 

这样列表就是

 public List> itemlist; 

这是你想要的。

它的工作原理! :)我希望我对它的解释是有道理的。