使用lambdas取消选中强制转换和不必要的抑制警告

时间:2014-06-29 20:27:07

标签: java eclipse lambda java-8 compiler-warnings

在使用Lambdas和泛型时,我遇到了一个特殊的不安全投射警告案例。

在复制和制作SSCCE期间,我发现这可能与lambda有效地"内部"退货声明。

问题是:为什么我会在warningUnnecessarySuppressWarnings方法中收到警告?。当删除 @SuppressWarnings("unchecked")时,我得到:

  

类型安全:从列表到列表的未选中投射

warningUnsafeCast方法所示。因此,新警告说,注释不是必需的。

我正在使用Eclipse Kepler SP2 for Java EE Developers,Build ID:20140224-0627

同时使用the recommended

Java 8 support in Eclipse Kepler更新站点
public static void main(String[] args) {
    System.out.println(warningUnnecessarySuppressWarnings());
    System.out.println(warningUnsafeCast());
    System.out.println(withoutWarning());
}

private static Integer perform(Function<List<?>, Integer> func) {
    return func.apply(Arrays.asList("a", "b", "c"));
}

private static Integer warningUnnecessarySuppressWarnings() {
    return perform(list -> {
        @SuppressWarnings("unchecked") // Unnecessary @SuppressWarnings("unchecked")
        List<String> unsafeCast = (List<String>) list;
        return unsafeCast.size();
    });
}

private static Integer warningUnsafeCast() {
    return perform(list -> {
        List<String> unsafeCast = (List<String>) list; // Type safety: Unchecked cast from List<capture#4-of ?> to List<String>
        return unsafeCast.size();
    });
}

@SuppressWarnings("unchecked")
private static Integer withoutWarning() {
    return perform(list -> {
        List<String> unsafeCast = (List<String>) list;
        return unsafeCast.size();
    });
}

1 个答案:

答案 0 :(得分:1)

有问题的代码是类型不安全的,因此应该生成警告。当然需要@SuppressWarnings注释来抑制此警告。

Eclipse Kepler SP2中显然是一个错误,它会对语句发出警告,但是当添加注释时警告不需要@SuppressWarnings

解决方法是在Eclipse编译器配置中禁用“不必要的@SuppressWarning”警告。