首页 > 解决方案 > 如何避免使用@SuppressWarnings 投射列表

问题描述

我有下面的代码,它转换了一个 List 对象类型,我想避免使用@SuppressWarnings("unchecked")注释,但我不想在 IDE 设置中将其关闭,因为我意识到它的重要性。

我将如何重写以下内容,以便删除注释并且 IDE 不会突出显示未经检查的强制转换警告?

我尝试将 替换CaseData?元素类型,但我需要CaseData稍后在课程中说明代码。

我看过这样的热门问题: 什么是 Java 中的 SuppressWarnings(“未选中”)?

@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
        HttpServletResponse response) throws Exception {

@SuppressWarnings("unchecked")
    List<CaseData> cases = (List<CaseData>) model.get("cases");

标签: javagenerics

解决方案


没有警告就没有办法做到这一点。在运行时根本无法检查对泛型类型的强制转换,编译器会通知您。我认为压制该警告通常是完全合法的,因此我认为您真的不需要其他解决方案。

但如果可以的话,请遵循@KarolDowbecki 的建议,我认为这是最好的解决方案。

如果您无论如何都想避免SuppressWarning,以下是一些解决方法:

使用元素时执行CaseData强制转换,而不是强制转换整个列表:

List<?> cases = (List<?>) model.get("cases");

// No warning here, since we're casting the element instead of the list
CaseData data = (CaseData) cases.get(0);

复制cases列表并事先检查所有元素:

// No warning here, since we're casting to List<?>
List<CaseData> cases = ((List<?>) model.get("cases")).stream()
// No warning here, since we're casting the elements instead of the list
    .map(d -> (CaseData) d).collect(toList());

推荐阅读