Невозможно создать класс с именем Entry

Следующий код не может быть скомпилирован с сообщением об ошибке:

Несоответствие типов: невозможно преобразовать тип элемента Test1.Entry в Map.Entry

Мой вопрос не может ли мы когда-либо использовать класс с именем Entry в нашем проекте при использовании hash map? И почему эта ошибка есть, хотя я не импортировал Entry класс здесь.

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);
                }
            }
        };
    }
}

Есть ли способ сохранить это имя класса и код успешно компилируется.

4 ответа

Решение

Так как вы используете инициализацию двойной скобкой, в этом блоке отображаются внутренние карты.

Либо переименуйте Entry класс или переместить код инициализации из блока инициализации HashMap Так что ваши Entry не скрывает внутренние карты Entry реализация.

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

Вы должны сообщить компилятору, что вы хотите использовать интерфейс Entry, предоставляемый java.util.

Как у вас уже есть класс с именем Entry в том же пакете, в котором вы его используете, следовательно, он неявно импортируется. Для всех мест, где вы собираетесь использовать Entry из java.util вы должны явно использовать java.util.Map.Entry вместо просто Entry, Таким образом, вы можете использовать оба класса.

У вас есть проблема с именами:

ваш Entry<T> в какой-то момент затеняет java.util.Map.Entry<K, V>

просто переименуйте Entry во что-то другое

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

Этот снимок может очистить ваши сомнения,

Как говорится во всплывающем окне с ошибкой, компилятор думает, что внутри вашего цикла for это java.util.Map.Entry, но вы хотите перейти к своему Entry класс здесь.

Даже если вы предполагаете, что вы не импортируете java.util.Map.EntryПопробуйте удалить первый импорт (т. Е. HashMap), и вы увидите, что вы больше не получаете ошибку несовместимых типов.

Вы можете попробовать любой из предложенных обходных путей, чтобы избавиться от этой проблемы.

Другие вопросы по тегам