无法创建名为 Entry 的 class

Unable to create a class with name Entry

以下代码编译失败,错误消息如下:

Type mismatch: cannot convert from element type Test1.Entry to Map.Entry

我的问题是我们不能在我们的项目中使用 class 和名称 Entry 而同时使用 hash map 吗?为什么会出现这个错误,尽管我没有在此处导入任何 Entry class。

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class Test1 {

    public static class Entry<T> {
        public String m() {
            return "A";
        }
    }

    public static void main(String[] args) {
        final Set<Entry> a = new HashSet<>();

        new HashMap<String, Entry>() {
            {
                for (final Entry entry : a) {
                    put(entry.m(), entry);
                }
            }
        };
    }
}

有什么方法可以保留这个 class 名称并且代码可以成功编译。

你的名字有问题:

您的 Entry<T> 在某些时候正在跟踪 java.util.Map.Entry<K, V>

只需将条目重命名为其他名称

public static class MyEntry<T> {
    public String m() {
        return "A";
    }
}

你需要告诉编译器你想使用java.util提供的Entry接口。

因为您在使用它的同一个包中已经有一个名为 Entry 的 class,因此它被隐式导入。对于您打算使用 java.util 中的 Entry 的所有地方,您必须明确使用 java.util.Map.Entry 而不仅仅是 Entry。这样你就可以同时使用 classes.

由于您使用的是 double brace initialization 地图内部结构在该块中公开。

重命名 Entry class 或将初始化代码移出 HashMap 的初始化块,这样您的 Entry 就不会隐藏映射内部 Entry实施。

final HashMap<String, Entry> map = new HashMap<>();
for (final Entry entry : a) {
   map.put(entry.m(), entry);
}

这张快照可能会消除您的疑虑,

如错误弹出窗口所述,编译器认为在您的 for 循环中它是 java.util.Map.Entry,但您想在此处遍历您的自定义 Entry class。

即使您假设您没有导入 java.util.Map.Entry,请尝试删除第一个导入(即 HashMap),您将看到您不再收到不兼容类型错误。

您可以尝试任何建议的解决方法来解决此问题。