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

Sim*_*erg 12 java eclipse lambda compiler-warnings java-8

在使用Lambdas和泛型时,我遇到了一个特殊情况,即不安全的强制转换警告.

在复制和制作SSCCE期间,我发现它可能与lambda在返回语句中有效"内部"的事实有关.

问题是:为什么我在warningUnnecessarySuppressWarnings方法中收到警告?.当卸下 @SuppressWarnings("unchecked"),我得到:

类型安全:未选中从列表到列表的强制转换

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

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

还在Eclipse Kepler中使用推荐的更新站点来支持Java 8

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();
    });
}
Run Code Online (Sandbox Code Playgroud)

Stu*_*rks 2

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

这显然是 Eclipse Kepler SP2 中的一个错误,它对语句发出警告,但在@SuppressWarnings添加注释时警告这是不必要的。

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