Странное поведение при использовании Enum в качестве типа в Map

1

Когда я использую Enum как тип в Map, я не получаю ошибку времени компиляции, если я использую ключ, тип которого отличается. Например, в приведенном ниже фрагменте кода я ожидал ошибку времени компиляции, когда я попытался получить доступ к карте с ключом, тип которого является String.

Почему generic не обеспечивает безопасность времени компиляции при использовании дженериков в Map? Когда я пытаюсь вставить проверку времени компиляции записи.

С List это, похоже, не так, поскольку я получаю ошибку времени компиляции.

Рассмотрим пример кода ниже

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class TestEnumGeneric{

    enum Sample{
            A,B
        }
    enum Sample2 {
          C,D
        }
    Map<Sample,String> someMap = new HashMap<Sample, String>();
    Map<String,String> someOtherMap = new HashMap<String, String>();
    List<Sample> someList = new ArrayList<Sample>();

    public void testMapWithEnum() {
        String value = someMap.get("123");
        value = someMap.get(Sample2.C);
        String value2 = someOtherMap.get(1);
        //someMap.put("123","123");
        //someList.add("123");
    }
}
  • 8
    Дубликат stackoverflow.com/questions/857420/…
  • 2
    Благодарю. это отвечает на вопрос.
Теги:
generics

1 ответ

2

Подпись Map.get

V get(Object key);

Поэтому он принимает любой Object но возвращает только V Нет ничего плохого во время компиляции с вашим использованием get.

NetBeans предупреждает об этом использовании:

Подозрительный вызов java.util.Map.get: данный объект не может содержать экземпляры String (ожидаемый образец)

Подпись Map.put

V put(K key, V value);

Поэтому вы должны использовать правильные типы.

Редактировать:

Чтобы процитировать JavaDoc:

Если эта карта содержит отображение из ключа k в значение v такое что (key==null? k==null: key.equals(k)), то этот метод возвращает v; в противном случае он возвращает null.

key.equals(k) значение только то, что key.equals(k), они не должны быть одного типа.

  • 0
    Если вы используете Eclipse, FindBugs также предупреждает об этом.
  • 0
    Спасибо за подробное объяснение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню