【发布时间】:2020-04-27 05:07:46
【问题描述】:
我尝试创建两个静态重载方法时遇到编译错误。谁能解释一下?
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) {}
如果你真的想拥有两个独立的方法,你必须提供不同的方法签名(例如不同的方法名称,其中一个方法的附加参数等)
【讨论】:
从方法参数Set<String> 和Set<Map<String,String>> 的角度来看是相同的,因为泛型类的所有实例都具有相同的运行时类(在您的情况下设置),而不管它们的实际类型参数如何.因此,您将获得erasure error。同样在运行时两者看起来像......
public static void a(Set stringSet) {} 和
public static void a(Set mapSet) {}
【讨论】:
您收到编译器错误,因为方法未正确重载。这两种方法都有一个 Set 类型的参数,这使得两种方法对于编译器来说都是相同的。
【讨论】: