当前位置: 首页 > 面试题库 >

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

王彭薄
2023-03-14
问题内容

我有课

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自身进行参数化:

public abstract class Report<T> implements Iterable<ReportItem<T>>

您添加需要从报表扩展的绑定

public abstract class Report<T extends Report> implements Iterable<ReportItem<T>>

但是您要 为报表原始类型 指定界限,该界限无效,因此您需要提供Report报表接收的type参数,即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;

这就是你想要的。

而且有效!:)我只是希望我的解释有意义。



 类似资料:
  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 考虑一个具有的API,如下所示: 很简单,只有页面大小和跳过计数属性。 此外,现在我还有一些类,它们也包含但未分页。 在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容: 我将PagedResults更改为: 错误 但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。 但是,如果我将接口

  • 我在我们公司做项目,我有一个注入对象的问题。让我们考虑一下我有这个实体提供商: 并使用上面的实体提供程序扩展JPAContainer 问题是(我理解),我无法使用类类型定义@Inject对象,因为Inject方法需要一个空构造函数。这里有什么解决方案吗?如何让它发挥作用?现在我得到了一个例外 非常感谢您的回答:)Ondrej

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 我被分配了一个问题:编写一个通用的加权元素 到目前为止,我已经创建了类并实现了Compariable,但在为W创建compareTo()方法时遇到了问题。我有: 我遇到的问题是,当我比较权重时,没有找到数据的权重。还有没有其他我必须创建的方法来正确地拥有一个在其中一个变量上实现可比较的类?谢谢你的帮助