我在哪里试图创建两个静态重载方法我有一个编译错误。谁能解释一下这个静态方法重载与泛型
public class A {
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}
}
我在哪里试图创建两个静态重载方法我有一个编译错误。谁能解释一下这个静态方法重载与泛型
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) {}
如果您确实需要两种独立的方法,您必须提供不同的方法签名(例如,不同的方法名称,方法之一的附加参数等)
方法解析是在编译时完成的,因此可以扩展Java语言以允许这种重载而无需具体化。但是,坚持更好的方法命名可能更简单。 – 2010-10-06 02:29:00
是的,但目标是不打破二进制格式(旧代码必须继续工作,即使使用新代码) – 2010-10-06 04:49:05
从方法角度来看,参数Set<String>
和Set<Map<String,String>>
是相同的,因为泛型类的所有实例都具有相同的运行时类(在你的情况下设置),而不管它们的实际类型参数。因此你会得到一个erasure error
。此外,在运行时都将看起来像...... public static void a(Set stringSet) {}
和 public static void a(Set mapSet) {}
你有编译器错误,因为方法不正确超载。两种方法都有Set类型的参数,这两个方法使得编译器的方法都是相同的。
什么是错误? – kasten 2010-10-05 06:22:43