2014-06-29 10 views
12

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(); 
    }); 
} 
+2

Nie otrzymuję 'niepotrzebnego @SuppressWarnings (" niezaznaczonego ")' z javac w twojej metodzie "warningUnnecessarySuppressWarnings". Może problem z zaćmieniem? – assylias

+1

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

+0

@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! –

Odpowiedz

1

Kod w pytaniu TYPE-niebezpieczne i dlatego powinien generować ostrzeżenie. Adnotacja @SuppressWarnings jest oczywiście konieczna, aby pominąć to ostrzeżenie.

Jest to błąd w Eclipse Kepler SP2, który wydaje ostrzeżenie dla instrukcji, ale ostrzega, że ​​@SuppressWarnings nie jest konieczne po dodaniu adnotacji.

Obejście problemu polega na wyłączeniu ostrzeżenia "niepotrzebne @SuppressWarning" w konfiguracji kompilatora Eclipse.