我有课
public class ReportItem<ReportType extends Report>{ }
和类(class)
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
为了绑定(bind)T
ReportItem<T>
的参数到从 Report
延伸的东西,您需要参数化 Report
本身:
public abstract class Report<T> implements Iterable<ReportItem<T>>
您添加它需要从报表扩展的绑定(bind)
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;
这就是你想要的。
而且有效! :) 我只希望我的解释有意义。
关于java - 如何使用泛型实现类型安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30616864/