使用泛型的静态方法重载

时间:2010-10-05 06:20:16

标签: java generics

在我尝试创建两个静态重载方法的地方,我遇到了编译错误。任何人都可以解释这个

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

3 个答案:

答案 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类型的参数,使得两种方法对于编译器都是相同的。