2009-07-15 6 views
24

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

36

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ę.

+0

Mam nadzieję, że wspomniana przez ciebie propozycja zostanie szybko wdrożona (Java7?), Ponieważ to by wyraźnie rozwiązało mój problem. – Mnementh

1

Nie sądzę, że można. Ostrzeżenie pojawi się, chyba że je zablokujesz lub odfiltrujesz z listy ostrzeżeń IDE.

2

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.

8

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

+1 Napisz uogólnioną powłokę wokół standardowego interfejsu API i usuń ostrzeżenia dotyczące klapsów. – skaffman

1

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.

+1

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

+1

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

+0

Naprawiam ostrzeżenia również w kodzie innych osób w tym samym projekcie. W razie problemów omawiamy zasady dla kontrolerów. – Mnementh

0

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

0

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.