Когда я использую 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");
}
}
Подпись 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)
, они не должны быть одного типа.