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

Это позволит вам полностью работать как со списком, так и с типом карты, не зная, какие типы ключей и значений для карты, но вы не сможете работать с типами, содержащимися в карте, без дополнительной информации о типах.

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