Tak, mam klasy z konstruktora tak:Dlaczego użycie Collections.emptySet() z generics działa w przydziale, ale nie jako parametr metody?
public FilterList(Set<Integer> labels) {
...
}
i chcę zbudować nową FilterList
obiekt z pustym zestawem. Po porady Joshua Blocha w jego książce Efektywna Java, nie chcę tworzyć nowego obiektu dla pustego zestawu; Ja po prostu użyć Collections.emptySet()
zamiast:
FilterList emptyList = new FilterList(Collections.emptySet());
To daje mi błąd, twierdząc, że nie jest java.util.Set<java.lang.Object>
java.util.Set<java.lang.Integer>
. OK, a co powiesz na to:
FilterList emptyList = new FilterList((Set<Integer>)Collections.emptySet());
Daje mi to również błąd! OK, a co powiesz na to:
Set<Integer> empty = Collections.emptySet();
FilterList emptyList = new FilterList(empty);
Hej, działa! Ale dlaczego? W końcu Java nie ma typu interferencji, dlatego pojawia się niezaznaczone ostrzeżenie o konwersji, jeśli wykonasz Set<Integer> foo = new TreeSet()
zamiast Set<Integer> foo = new TreeSet<Integer>()
. Ale Set<Integer> empty = Collections.emptySet();
działa bez ostrzeżenia. Dlaczego?
wszystkie poniższe odpowiedzi są poprawne, ale to, czego nie rozumiem: dlaczego prawda zainicjować swoją kolekcję za pomocą emptyList zamiast wywoływania domyślnego konstruktora bez parametrów? Każda znana kolekcja ma konstruktor z istniejącą kolekcją i pustym konstruktorem. –
Co ciekawe, kompilacja DOES: 'FilterList emptyList = new FilterList ((Set) (Set Extends Object>) Collections.emptySet());' –
EricS
Kolejny całkiem zabawny przykład: 'Set emptySet = (Set ) Collections.emptySet(); 'nie kompiluje się. –
neo