我有课
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是当前报表的类型。
发布于 2015-06-03 10:03:36
我想你是在找下面的东西。
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>延伸出来的东西来参数化ReportReportItem<T>的列表都属于同一类型的Report为了将ReportItem<T>的ReportItem<T>参数绑定到从Report扩展的内容,需要将Report本身参数化:
public abstract class Report<T> implements Iterable<ReportItem<T>>添加它需要从报表中扩展的绑定。
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;这就是你想要的。
我只是希望我对它的解释是有意义的。
https://stackoverflow.com/questions/30616864
复制相似问题