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