2010-08-04 7 views
8

Mam problem z ograniczonymi zagnieżdżonymi symbolami wieloznacznymi w generycznych elementach Java.Zagnieżdżony element wieloznaczny w języku Java nie będzie kompilowany

Oto częsty przypadek:

public void doSomething(Set<? extends Number> set) {} 

public void callDoSomething() { 
    Set<Integer> set = new HashSet<Integer>(); 
    doSomething(set); 
} 

Jest to standardowe leki generyczne Java, działa dobrze.

Jeśli jednak wieloznaczny zostaje zagnieżdżona, to już nie działa:

public void doSomething(Map<String, Set<? extends Number>> map) {} 

public void callDoSomething() { 
    Map<String, Set<Integer>> map = new HashMap<String, Set<Integer>>(); 
    doSomething(map); 
} 

Prowadzi to do błędu kompilatora.

Próbowałem różnych odlewów i permutacji wieloznacznych, ale nie mogę tego uruchomić. Nie przypominam sobie, aby już wcześniej widziałem tę kwestię i od lat pracuję z lekami generycznymi. Czy jestem zbyt zmęczony i brakuje mi czegoś oczywistego?

+0

Jest wyjaśnienie dla tego w najczęściej zadawanych pytaniach Java Generics: http://www.angelikalanger.com/GenericsFAQ/FAQSections /TypeArguments.html#FAQ104 –

Odpowiedz

15

Tak więc problem jest doSomething mogą być realizowane jako:

public void doSomething(Map<String, Set<? extends Number>> map) { 
    Set<Float> set = ...; 
    map.put("xyz", set); 
} 

Musisz zdecydować, co właściwie znaczy.

Prawdopodobnie coś jak:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {} 
+0

Tak, właśnie to sobie uświadomiłem. Mógłbym przysiąc, że próbowałem tego wczoraj, ale prawdopodobnie miałem inną subtelną zmianę. – nilskp

0

Aby kod do pracy Tworzenie HashMap jak:

Map<String, Set<? extents Number>> map = new HashMap<String, Set<? extents Number>>(); 
1

to będzie pracować dla Ciebie:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {} 
Powiązane problemy