java - 如何使用泛型实现类型安全?

标签 java generics

我有课

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/

相关文章:

java - 如何在 Java 中使用带有语言运算符和扩展 Number 的泛型类的泛型

c# - 静态通用类作为字典

java - 如何在 EditText 密码输入字段旁边放置 ImageView

java - Jhipster 4 中的角色

java - 避免在 h :inputText 中显示默认的 int 值 0

reactjs - react 和 typescript : How to extend generic component props?

java - 无法使用 oracle.apex.APEXExport 类登录数据库

java - 改造 2 和 GSON java.lang.IllegalArgumentException : Field map contained null value for key

Java 泛型 : Restricting a class to specific implementations.

java:多维泛型数组创建