在尝试创建两个静态重载方法的地方,出现编译错误。有人可以解释吗?
public class A {
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}
}
原因是type erasure。泛型没有存储在类中,它们仅是编译时信息,因此在运行时,这两种方法是相同的,因此存在命名冲突。
参考
这三个方法实际上是相同的(阅读:它们产生相同的字节码):
public static void a(Set plainSet) {}
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}
如果您确实想拥有两个单独的方法,则必须提供不同的方法签名(例如,不同的方法名称,其中一个方法的附加参数,等等。]
[从方法的角度来看,参数Set<String>
和Set<Map<String,String>>
是相同的,因为泛型类的所有实例都具有相同的运行时类(在您的情况下为Set),而不管它们的实际类型参数如何。因此,您将得到一个erasure error
。同样在运行时,两者都看起来像...public static void a(Set stringSet) {}
ANDpublic static void a(Set mapSet) {}
您收到编译器错误,因为方法未正确重载。这两个方法都有一个Set类型的参数,这使两个方法对于编译器都相同。