使用generics的静态方法重载

在我尝试创建两个静态重载方法的地方,我遇到了编译错误。 谁能解释一下呢

public class A { public static void a(Set stringSet) {} public static void a(Set<Map> mapSet) {} } 

原因是类型擦除 。 generics不存储在类中,它们只是编译时信息,因此在运行时,这两种方法是相同的,因此存在命名冲突。

参考

  • Sun Java教程的generics部分
  • Javagenerics和集合 (书)

这三种方法实际上是相同的(读取:它们产生相同的字节码):

 public static void a(Set plainSet) {} public static void a(Set stringSet) {} public static void a(Set> mapSet) {} 

如果您确实想要两个单独的方法,则必须提供不同的方法签名(例如,不同的方法名称,其中一个方法的附加参数等)

从方法参数SetSet>的角度来看是相同的,因为generics类的所有实例都具有相同的运行时类(在您的情况下为Set),而不管他们的实际类型参数。 因此,您将收到erasure error 。 同样在运行时,它们看起来都像…… public static void a(Set stringSet) {} AND public static void a(Set mapSet) {}

您收到编译器错误,因为方法没有正确重载。 两种方法都有一个Set类型的参数,使得两种方法对于编译器都是相同的。