Method overloading with generics [duplicate]
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) {}
}
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
- Generics section of the Sun Java Tutorial
- Java Generics and Collections (Book)
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.)
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) {}
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.
精彩评论