2010-10-05 94 views
8

我在哪里试图创建两个静态重载方法我有一个编译错误。谁能解释一下这个静态方法重载与泛型

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

什么是错误? – kasten 2010-10-05 06:22:43

回答

14

原因是type erasure。泛型没有存储在类中,它们只是编译时信息,所以在运行时,这两种方法是相同的,因此存在命名冲突。

参考

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

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

如果您确实需要两种独立的方法,您必须提供不同的方法签名(例如,不同的方法名称,方法之一的附加参数等)

+0

方法解析是在编译时完成的,因此可以扩展Java语言以允许这种重载而无需具体化。但是,坚持更好的方法命名可能更简单。 – 2010-10-06 02:29:00

+0

是的,但目标是不打破二进制格式(旧代码必须继续工作,即使使用新代码) – 2010-10-06 04:49:05

1

从方法角度来看,参数Set<String>Set<Map<String,String>>是相同的,因为泛型类的所有实例都具有相同的运行时类(在你的情况下设置),而不管它们的实际类型参数。因此你会得到一个erasure error。此外,在运行时都将看起来像...... public static void a(Set stringSet) {}public static void a(Set mapSet) {}

0

你有编译器错误,因为方法不正确超载。两种方法都有Set类型的参数,这两个方法使得编译器的方法都是相同的。