Podobają mi się funkcje generyczne w Javie i często go używam. Ale mam problem, jeśli korzystam z bibliotek, które nie są jeszcze świadome generycznych. Przykładem są serwlety. Jeśli użyjesz ServletRequest.getParameterMap()
, wynik będzie mapą nieprzetworzoną, ale zawiera tylko String
jako klucze i String[]
jako wartości. Dlatego chcę go przypisać do Map<String, String[]>
. Ale za to zadanie otrzymuję ostrzeżenie. Jak mogę uniknąć tego ostrzeżenia w języku, a nie po prostu pomijać ostrzeżenie adnotacją @SuppressWarnings
.Jak uniknąć niezaznaczonego ostrzeżenia o konwersji w Javie, jeśli używasz starszych bibliotek?
Odpowiedz
Jak inni mówili, ostrzeżenia nie można uniknąć, chyba że je tłumi. Problem z IMHO polega na tym, że musisz zaśmiecać swój kod adnotacjami, które dotyczą małego zakresu lub zignorować je na całym świecie i popełnić błędy.
IIRC to propozycja generowania ostrzeżeń, w których surowe typy są zwracane zamiast w trakcie połączenia.
Tymczasem myślę, że najlepszym rozwiązaniem jest użycie metody otoki tak, że ostrzeżenia są ograniczone do jednego miejsca, gdzie jest to bezpieczne, aby je zignorować:
class NoWarn {
public static Map<String, String[]> getParameterMap(ServletRequest r)
{
@SuppressWarnings("unchecked")
Map<String, String[]> result = r.getParameterMap();
return result;
}
}
Uwaga Ta odpowiedź była edytowane z komentarzem, że adnotacje nie mogą znajdować się w ciałach metod. Jest to niepoprawne, powyższe jest poprawne pod względem składniowym. Odwróciłem zmianę.
Nie sądzę, że można. Ostrzeżenie pojawi się, chyba że je zablokujesz lub odfiltrujesz z listy ostrzeżeń IDE.
Jak można uniknąć tego ostrzeżenia z językiem , a nie po prostu tłumienia ostrzeżenie z SuppressWarnings-adnotacji.
Adnotacja jest sposób, aby uniknąć ostrzeżenie z językiem. Nie ma innego wyjścia.
Najłatwiejszą rzeczą do zrobienia jest enkapsulacja konwersji ze starszego na ogólny i wyłączenie ostrzeżenia tylko tam.
E.g. możesz umieścić ogólną fasadę w swojej starszej bibliotece, choć nie zawsze jest to warte zachodu.
+1 Napisz uogólnioną powłokę wokół standardowego interfejsu API i usuń ostrzeżenia dotyczące klapsów. – skaffman
Miałem ten sam problem, właśnie wyłączyłem wszystkie ogólne ostrzeżenia i jestem szczęśliwy :) Można również wyłączyć ostrzeżenie serialVersionUID, ponieważ wiele osób nie używa serialVersionUID.
w Eclipse - Okno/Percje/Java/Kompilator/Błędy/Ostrzeżenia i wyłącz wszystkie typy Ogólne.
P.S. Wiele złych ostrzeżeń powoduje ignorowanie wszystkich ostrzeżeń, a niektóre mogą być przydatne.
Używam ostrzeżeń jako możliwości poprawy. Nie otrzymuję wielu ostrzeżeń, ponieważ naprawiam je wszystkie po drodze. Zwykle niezaznaczone ostrzeżenia o konwersji są bardzo pomocne w znalezieniu części kodu, które można poprawić. Ale w tym przypadku nie widzę sposobu, bez tłumienia tego ostrzeżenia. – Mnementh
masz szczęście, mam teraz 61 ostrzeżeń w projekcie, nawet nieużywane ostrzeżenie o imporcie. Naprawię to, ponieważ nie są one w moim kodzie, więc zamknąłem kartę Problemów i po prostu szukam żółtych tagów w moim kodzie źródłowym. – IAdapter
Naprawiam ostrzeżenia również w kodzie innych osób w tym samym projekcie. W razie problemów omawiamy zasady dla kontrolerów. – Mnementh
jak mówili inni, jedynym sposobem na pozbycie się tego ostrzeżenia jest stłumienie go.
Najlepszą praktyką jest enkapsulacja ostrzeżenia za pomocą metod i klas.
ale z innymi ostrzeżeniami zawsze staraj się rozwiązać problem, który je powoduje, np. Usuń nieużywany import itp. ... sprawia, że Twoja aplikacja jest bardziej szczupła i lepsza.
szczęśliwy kodowania
Natknęliśmy się na to pytanie, jak również stara się wymyślić sposób, aby uniknąć używania adnotacji zakazujące w takich przypadkach. Znalazłem inną alternatywę, o której myślałem, że warto wspomnieć:
Map<?, ?> map = servletRequest.getParameterMap();
String[] values = (String[]) map.get("key");
Zasadniczo używamy symbolu wieloznacznego "?" aby wskazać, że mapa może mieć dowolny typ klucza i wartości.
Potencjalnym minusem, który widzę, jest to, że robimy wyraźną obsadę podczas pobierania wartości, co, jak sądzę, spowoduje niewielki wzrost wydajności podczas pracy.
Mam nadzieję, że wspomniana przez ciebie propozycja zostanie szybko wdrożona (Java7?), Ponieważ to by wyraźnie rozwiązało mój problem. – Mnementh