开发者

Method overloading with generics [duplicate]

This question already has answers here: 开发者_如何学编程 Method has the same erasure as another method in type (7 answers) Closed 2 years ago.

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜