2016-08-17 3 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)); 
    } 
} 

왜 OK 단순히 Entry::getXX 대신 Entry<DeviceID, T>>::getXX 말을? 나는 (Map.)EntryMap<DeviceID, T>의 항목으로 사용할 수 없습니다하는 Entry<Object, Object> 기본값 것이라고 생각했다.

+2

귀하의 의견은'지도'콘크리트 형''그 방법 참조의 소유자 구성 요소가 자주 당신을위한 컴파일러에 의해 유추 할 수 있습니다에 대한 귀하의 항목도 유형'의 Map.Entry ' –

+2

유형 매개 변수가 이유지만을 가지고 있기 때문에 그것들을 명시 적으로 넣을 수 있습니다. –

+0

컴파일러는 이러한 것을 당신을 위해 추론합니다. 그게 그 직업입니다. –

답변

5

귀하의 입력 매개 변수는 모든 중간 일반적인 유형을 추론 할 수있는 컴파일러를위한 충분한 형태의 정보가 있습니다.

그것은 "무엇에 온다"와 "무엇을 온다"... 그리고 "사이의 단계가"일치 것을 알 수 있습니다.

예 : 첫 번째 호출 entrySet()이고; 그래서 아마도 주변 클래스는 K, V가 정의 된 Map입니다. 따라서 컴파일러는 EntrySet<K,V>을 처리하고 있다는 것을 알고 있습니다 ... neededIDs에있는 generic 형식과 아마도 일치합니다.

등등 ... 당신이에 관심이 있다면 유형을 "추론"자신; 나는 유창하게 연결된 메서드 호출을 분해함으로써 시작하는 것이 좋습니다. 하나씩; 그들이 반환하는 것을 파악하고 각 작업의 결과 유형에 대해 알 수있는 정보를 제공합니다.

관련 문제