gpt4 book ai didi

java - 为什么 Java Type Erasure 没有阻止这段代码的编译

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:25:11 28 4
gpt4 key购买 nike

我有一个类定义了以下两个方法:

public Map<String, Map<String, String>> method(final Map<String, Map<String, String>> data)

public boolean method(final Map<String, String> data)

基于泛型的 Java 类型删除,此代码不应编译,因为它们都以:

method(Map data)

然而,这段代码在Java 6中编译成功,但在Java 8中却无法编译。

有人可以告诉我为什么它可以在 Java 6 下编译吗?

最佳答案

它在 Java 6 下编译,但在 Java 7 或 Java 8 下不编译。

Java 5 和 Java 6 中有一个错误 fixed in Java 7 (#6182950) .

该错误页面指的是 JLS, Section 8.4.8.3 ,其中指出:

It is a compile-time error if a type declaration T has a member method m1 and there exists a method m2 declared in T or a supertype of T such that all of the following are true:

  • m1 and m2 have the same name.

  • m2 is accessible from T.

  • The signature of m1 is not a subsignature (§8.4.2) of the signature of m2.

  • The signature of m1 or some method m1 overrides (directly or indirectly) has the same erasure as the signature of m2 or some method m2 overrides (directly or indirectly).

这两种方法都没有对方的子签名,因为这两种参数类型 Map<String, Map<String, String>>Map<String, String>是另一个的子类型。但是,它们具有相同的删除,Map .

它本不应该编译的,但是 Java 7 的 Java 错误已修复。

关于java - 为什么 Java Type Erasure 没有阻止这段代码的编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28442177/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com