Непроверенные броски и ненужные подавленные предупреждения с лямбдами

Во время работы с Lambdas и generics я столкнулся с особым случаем небезопасных предупреждений о броске.

Во время воспроизведения и создания SSCCE я обнаружил, что это, вероятно, связано с тем, что лямбда эффективно "внутри" оператора return.

Вопрос: Почему я получаю предупреждение в методе warningUnnecessarySuppressWarnings?. При удалении @SuppressWarnings("unchecked") я получаю:

Тип безопасности: снятый снимок из списка в список

Как показано в методе warningUnsafeCast. Из-за этого аннотация не является ненужной, как говорится в новом предупреждении.

Я использую Eclipse Kepler SP2 для разработчиков Java EE, с кодом сборки: 20140224-0627

Также используя рекомендуемый сайт обновления для поддержки Java 8 в 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

Этот код является небезопасным и поэтому должен генерировать предупреждение. Аннотация @SuppressWarnings, конечно же, необходима для подавления этого предупреждения.

По-видимому, ошибка в Eclipse Kepler SP2 вызывает предупреждение для оператора, но затем предупреждает, что @SuppressWarnings не требуется при добавлении аннотации.

Обходной путь заключается в отключении "ненужного @SuppressWarning" предупреждения в конфигурации компилятора Eclipse.