Podczas pracy z Lambdą i lekarzami generycznymi napotkałem specjalny przypadek ostrzeżeń o niebezpiecznym rzucaniu.Niezaznaczone rzuty i niepotrzebne pomijanie ostrzeżeń za pomocą lambdasa
Podczas odtwarzania i tworzenia SSCCE, stwierdziłem, że jest to prawdopodobnie związane z faktem, że lambda jest faktycznie "wewnątrz" instrukcji return.
Pytanie brzmi: Dlaczego otrzymuję ostrzeżenie w metodzie warningUnnecessarySuppressWarnings
?. Kiedy usuwania@SuppressWarnings("unchecked")
, otrzymuję:
Typ bezpieczeństwa: Nieograniczony odlana z listy do listy
Jak pokazano w metodzie warningUnsafeCast
. Z tego powodu adnotacja nie jest niepotrzebna, jak głosi nowe ostrzeżenie.
Używam Eclipse Kepler SP2 dla Java EE Developers, z wbudowanym id: 20140224-0627
też Korzystanie the recommended aktualizacji miejscu 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();
});
}
Nie otrzymuję 'niepotrzebnego @SuppressWarnings (" niezaznaczonego ")' z javac w twojej metodzie "warningUnnecessarySuppressWarnings". Może problem z zaćmieniem? – assylias
Przypisujesz 'List >' do 'Listy'. Dlaczego nie powinno to spowodować ostrzeżenia? W przypadku zastąpienia symbolu wieloznacznego parametrem "wykonaj" parametrem typu wszystkie ostrzeżenia znikną. –
nosid
@nosid W pełni zdaję sobie sprawę z tego, co robię. Pytanie brzmi: dlaczego otrzymuję ostrzeżenie ** Niepotrzebne @ SuppressWarnings' **, podczas gdy w rzeczywistości adnotacja '@ SuppressWarnings' nie jest wcale niepotrzebna. Ten kod to SSCCE, to oczywiście nie jest mój rzeczywisty kod! –