我有课
public class ReportItem<ReportType extends Report>{ }
和班级
public abstract class Report implements Iterable<ReportItem>{
private List<ReportItem<? extends Report> > itemList;
public void add(ReportItem<? extends Report> item){
itemList.add(item);
}
//Some other staff
}
public class ConcreteReport extends Report{
//Some staff
}
问题在于方法add(ReportItem<? extends Report>)
我可以提供的项目不与当前报告绑定,但与另一个报告绑定,并且编译器不会抱怨,这是不安全的。
方法可以写吗add
以类型安全的方式,即我们只能作为参数传递ReportItem<T>
其中 T 是当前报告的类型。
我认为您正在寻找以下内容。
public abstract class Report<T extends Report<T>> implements Iterable<ReportItem<T>>{
private List<ReportItem<T>> itemList;
public void add(ReportItem<T> item){
itemList.add(item);
}
//Some other stuff
}
public class ConcreteReport extends Report<ConcreteReport> {
//Some stuff
}
它的工作原理是:
- 你想要参数化
ReportItem<T>
与延伸自的东西Report
- 您想要确保该列表
ReportItem<T>
都属于同一类型Report
为了绑定T
的参数ReportItem<T>
延伸到从Report
,你需要参数化Report
itself:
public abstract class Report<T> implements Iterable<ReportItem<T>>
您添加它需要从 Report 扩展的绑定
public abstract class Report<T extends Report> implements Iterable<ReportItem<T>>
但是您正在指定的界限原始报告类型,这不起作用,所以你需要提供Report
与报告接收的类型参数,即T
.
public abstract class Report<T extends Report<T>> implements Iterable<ReportItem<T>>
这样你就可以参数化List<ReportItem<T>>
使用您扩展的具体类型:
public class ConcreteReport extends Report<ConcreteReport> {
这样列表将是
public List<ReportItem<ConcreteReport>> itemlist;
这就是你想要的。
它有效! :) 我只是希望我的解释有意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)