9

I have a problem with bounded nested wildcards in Java generics.

Here's a common case:

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

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

This is standard Java generics, works fine.

However if the wildcard becomes nested, it no longer works:

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

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

This leads to a compiler error.

I've tried a variety of casts and wildcard permutations, but I'm unable to get this working. I don't recall seeing this issue before, and I've worked with generics for years. Am I just too tired and missing something obvious?

Pang
  • 9,073
  • 146
  • 84
  • 117
nilskp
  • 2,977
  • 1
  • 29
  • 33
  • 2
    There's an explanation for this in the Java Generics FAQ: http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ104 – Rag Dec 11 '14 at 23:27

3 Answers3

15

So the problem is, doSomething could be implemented as:

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

You need to decide what you actually mean.

Probably something like:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}
Tom Hawtin - tackline
  • 143,103
  • 30
  • 210
  • 299
  • Yes, I just independently realized this. I could have sworn I tried that yesterday, but I probably had some other subtle change. – nilskp Aug 04 '10 at 13:34
1

this will work for you:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}
newacct
  • 115,460
  • 28
  • 157
  • 222
0

To make code to work Create HashMap as:

Map<String, Set<? extents Number>> map = new HashMap<String, Set<? extents Number>>();
Bhargav Rao
  • 45,811
  • 27
  • 120
  • 136
YoK
  • 14,075
  • 4
  • 47
  • 67