2016-08-17 4 views
1

В следующем фрагменте:Почему допустимо опускать здесь параметр общего типа?

public class IDMapBase<T> extends HashMap<DeviceID, T> { 
    public Map<DeviceID, T> filterMap(Set<DeviceID> neededIDs) { 
     return entrySet().stream() 
      .filter(e -> neededIDs.contains(e.getKey())) 
      .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); 
    } 
} 

Почему это ОК, чтобы просто сказать Entry::getXX вместо Entry<DeviceID, T>>::getXX? Я думал, что (Map.)Entry по умолчанию будет Entry<Object, Object>, что невозможно использовать как запись Map<DeviceID, T>.

+2

Поскольку ваш вход 'Map' имеет конкретный тип' ', поэтому ваши данные также имеют тип' 'Map.Entry

+2

параметры Тип для владельца компонента ссылок метод часто может быть выведен компилятором для вас, но вы могут свободно размещать их в явном виде. –

+0

Компилятор передает эти вещи для вас. Это его работа. –

ответ

5

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

Может показаться, что «что приходит» и «что выходит» ... и «шаги между ними» совпадают.

Пример: первый звонок entrySet(); так что, возможно, окружающий класс представляет собой карту с определенными К, V. Поэтому компилятор знает, что имеет дело с некоторыми EntrySet<K,V> ... вероятно, совпадающими с общим типом, найденным на neededIDs.

И так далее ... если вы заинтересованы в «выводе» самих типов; Я бы посоветовал начать с того, что вы разложили эти вызовы с плавным набором цепочек. По одному; что они возвращают, и что вы можете знать о типах результатов каждой операции.

Смежные вопросы