2011-11-23 19 views
12

Rozumiem, że auto-boksowanie powinno być wykonywane ostrożnie, ponieważ odwołanie, które jest niesklasyfikowane, może mieć wartość zerową. Dlaczego auto-boksowanie jest również oznaczone jako ostrzeżenie? Czy są tu jakieś pułapki?Dlaczego auto-boks oznaczony jako ostrzeżenie?

+0

Moje ekologiczne poćmienie nie wyświetla ostrzeżeń o automatycznym boksowaniu i usunięciu boksu. Jakiego typu/wersji zaćmienia używasz? – LanguagesNamedAfterCofee

+2

Można go włączyć (i inne różne ostrzeżenia) w oknie Właściwości projektu -> Kompilator Java -> Błędy/ostrzeżenia -> Problemy z programowaniem. – Artium

+0

Zobacz: https://bugs.eclipse.org/bugs/show_bug.cgi?id=163065 Jest to żądanie funkcji do oddzielania boksów od rozpakowywania. – Kyle

Odpowiedz

6

Jeśli nie spodziewasz się problemów z wydajnością (pod względem mikrooptymalizacji), możesz bezpiecznie wyłączyć to ostrzeżenie. To tylko wskazówka na wypadek, gdybyś nie wiedział, że tu się dzieje auto-boks. W kodzie biznes logicznym, w którym masz obciążenie we/wy (z powodu transakcji DB lub dostępu do dysku), auto-boksowanie nigdy nie jest problemem.

+1

W czasie zaćmień nie można zmienić tylko ostrzeżeń bokserskich bez wyłączania ostrzeżeń przed boksowaniem. Czy to jest coś, co sugerowałbyś wyłączenie (obaj z nich)? Wykonuję projekt uniwersytecki, a nauczyciel chce mieć zero ostrzeżeń na maksymalnym poziomie ostrzeżenia. (Selektywne ignorowanie ostrzeżeń jest dozwolone) – Artium

+0

@Artium W twoim przypadku możesz użyć jawnych konwersji, aby operacja była widoczna z 'int i = Integer.intValue() 'i' Integer I = new Integer (i) '. Potem kompilator nie będzie narzekał. – stacker

+1

Występuje błąd związany z oddzielaniem ostrzeżeń: https://bugs.eclipse.org/bugs/show_bug.cgi?id=163065 – Kyle

2

autoboxing może przyczynić się do błędu związanego z „Usuń” metody zbiorów, choć prawdopodobnie jest to dość niejasne bug.

Napotkałem ten błąd, gdy użyłem generatora liczb losowych, aby wybrać indeks elementu do usunięcia z tablicy ArrayList. Generator zwrócił długi prymityw, który przypadkowo próbowałem użyć jako parametru dla List.remove (indeks int). Kompilator przekonwertował długi na długi i użył go w List.remove (Object o), co dało zupełnie inne zachowanie. Na szczęście instrukcja assert szybko zauważyła błąd.

Zgodnie z tą dyskusją dotyczącą tego problemu z "usunięciem", ktoś inny wpadł na podobny problem, gdy niespodziewanie zachowywał się jak liczba całkowita, choć nie rozumiem, jak to się stało. https://stackoverflow.com/questions/104799/why-arent-java-collections-remove-methods-generic (patrz komentarz ScArchera2)

+0

To oczekiwane zachowanie dla przeciążonych funkcji, a nie błąd. –

Powiązane problemy