tags:

views:

120

answers:

3

Where I try to create two static overloading methods I got an compilation error. Can anyone explain this

public class A {
 public static void a(Set<String> stringSet) {}
 public static void a(Set<Map<String,String>> mapSet) {}
}
+12  A: 

The reason is type erasure. Generics are not stored in the classes, they are compile-time info only, so at runtime, the two methods are identical and hence there is a naming conflict.

Reference

These three methods are actually identical (read: they produce identical bytecode):

public static void a(Set plainSet) {}
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}

If you really want to have two separate methods, you must provide different method signatures (e.g. different method names, an additional parameter for one of the methods etc.)

seanizer
Method resolution is done at compile time, so the Java language could be extended to allow this sort of overloading without reification. However, it's probably simpler to insist on better method naming.
Tom Hawtin - tackline
Yes, but the objective was to not break the binary format (legacy code had to keep working, even with new code)
seanizer
+1  A: 

From the point of view of the methods parameters Set<String> and Set<Map<String,String>> are the same, because all instances of a generic class have the same run-time class (Set in your case), regardless of their actual type parameters. Therefore you will get a erasure error. Also at runtime both will look like... public static void a(Set stringSet) {} AND public static void a(Set mapSet) {}

Favonius
A: 

You got the compiler error because the methods are not overloaded properly. Both methods have a parameter of Set type that makes both the methods identical for he compiler.

Amit