使用泛型的方法重载[重复]

问题描述 投票:8回答:3

在尝试创建两个静态重载方法的地方,出现编译错误。有人可以解释吗?

public class A {
 public static void a(Set<String> stringSet) {}
 public static void a(Set<Map<String,String>> mapSet) {}
}
java generics
3个回答
16
投票

原因是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
投票

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


0
投票

您收到编译器错误,因为方法未正确重载。这两个方法都有一个Set类型的参数,这使两个方法对于编译器都相同。

© www.soinside.com 2019 - 2024. All rights reserved.