这是关于 Java 中使用参数化类型的签名方法的另一个问题。
假设您有以下两种方法:
static void f(List<Integer> l) {} static void f(List<String> l) {}
编译器会抱怨两种方法在类型擦除后具有相同的签名(两种参数类型都被擦除为仅List
)。
stackoverflow 上的许多类似问题都询问为什么会这样,但问题始终是关于实例(非静态)方法(例如,请参阅方法与类型中的另一个方法具有相同的擦除)。
通常一半的答案基于以下(非常错误的)论点:编译器将删除字节码中的所有类型参数并使方法无法区分。好吧,只需打印字节码javap
,您就会看到是否所有内容都被删除了!(虽然字节码丢失了大量参数化数据,但实际上保留了完整的方法签名,当您想要使用包含泛型类和方法的依赖项编译新类时,这绝对有用)。
另一方面,最好的答案通常引用 JLS 8.4.2 并解释说,为了与旧的、预通用的 Java 版本(以及较新版本中的原始类型)兼容,禁止使用具有覆盖等效签名的方法。
我同意后一个论点,但它只意味着实例方法(非静态),因为静态方法无论如何都不能被覆盖。
静态方法可能有类似的解释,但我未能指出它。有人可以帮助我理解这一点吗?
MYYA
相关分类