如何使用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
为了将ReportItem
的T
参数绑定到从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;
这是你想要的。
它的工作原理! :)我希望我对它的解释是有道理的。