Во время работы с 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();
});
}