Java - Почему я не могу частично ввести переменную?
Почему при вводе новой переменной с существующей переменной вводится все или ничего?
Например, скажем, у меня есть переменная data
чей тип List<Map<String, ArrayList<String>>>
и я хочу передать его значение tempData
, Почему при решении tempData
типа я ограничен List
или же List<Map<String, ArrayList<String>>>
?
Если бы я только хотел взаимодействовать с определенным "уровнем" data
скажи Map
уровень, как мне просто прыгнуть туда? Например, почему я не могу List<Map> tempData = data
?
Я искал свой учебник и этот сайт, но нигде не могу найти объяснения, почему это так. Есть ли что-то, что могло бы пойти не так, если бы нам разрешили "частично печатать"?
Я знаю, что могу просто сильно напечатать tempData
для начала, но мне любопытно, почему у Java есть подход "все или ничего".
2 ответа
На самом деле, вы можете: хитрость заключается в использовании ?
а также ? extends
в ваших декларациях. Следующее работает и становится более конкретным:
List<Map<String, ArrayList<String>>> data = null; // Replace null with content
Object temp1 = data;
List<?> temp2 = data;
List<? extends Map<?, ?>> temp3 = data;
List<? extends Map<String, ?>> temp4 = data;
List<? extends Map<String, ? extends ArrayList<?>>> temp5 = data;
List<Map<String, ArrayList<String>>> temp6 = data;
Вы можете использовать java-шаблоны для замены типов, для которых вам не нужна полная информация о типах. Похоже на это
public static < K, V > List< Map< K, V > > test( List< Map< K, V > > list ) {
return list;
}
Это позволит вам полностью работать как со списком, так и с типом карты, не зная, какие типы ключей и значений для карты, но вы не сможете работать с типами, содержащимися в карте, без дополнительной информации о типах.