2017-01-06 4 views
1

를 반환, 내가 가진일반 매개 변수 설정을위한 목록 <ChildInterface> 스트림에 있지만, 직접 메소드 호출이 반환 목록 <Parent>

public class MyClass { 
    private List<Child1> child1List = new ArrayList<>(); 

    public List<Parent> getChild1List(Contact contact) { 
     return child1List.parallelStream() 
         .filter(m -> m.getContacts().contains(contact)) 
         .sorted(Comparator.comparing(Parent::getParentField)) 
         .collect(Collectors.toList()); 
    } 
} 

내가이 작업을 수행 할 때 getChild1List는 List<Parent>을 반환합니다 (List<Child1>을 반환하지 않아야합니까?)

나중에이 스트림이 다른 메서드에 유용하다는 것을 알았습니다. 그것을 비난하고 그것으로 일반적인 방법을 만들었습니다. 나는 부모를 확장하는 여러 인터페이스를 가지고, 그래서 나는 다음 않았다 같이

private <T extends Parent> List<T> returnsListByContact(List<T> childList, Contact contact) { 
     return childList.parallelStream() 
         .filter(m -> m.getContacts().contains(contact)) 
         .sorted(Comparator.comparing(Parent::getParentField)) 
         .collect(Collectors.toList()); 
    } 

getChild1List(Contact contact)가되었다 :

public List<Parent> getChild1List(Contact contact) { 
     return returnsListByContact(child1List, contact); 
    } 

을하지만 지금은 getChild1List가 List<Child1>를 반환하는 것을 인용,이를 좋아하지 않는다. 이유는 모르겠지만, 스트림의 구현은 전혀 변경되지 않았습니다. 다만, 시작하는 childList가 MyClass의 private 멤버 필드에 대한 직접 호출이 아닌 일반 매개 변수를 통해 이루어 졌다는 점만 제외하면 말입니다.

왜 두 가지 다른 것을 반환합니까? getChild1List의 리턴 타입 결정 -

+1

서식이 수정되었습니다. 인라인 된 코드는 역 인용 부호를 사용하고 4 블록 씩 들여 쓰기를하면 코드 블록을 포맷 할 수 있습니다. 코드에 4 개의 들여 쓰기를 표시하려면 4 개의 공백을 추가하여 코드 블록으로 형식화 한 다음 들여 쓰기를 표시 할 * 추가 ​​* 4 공백을 추가해야합니다. 탭을 사용하지 마십시오. –

+0

감사! 여러 줄을 쓸 때 블록을 견고하게 유지하는 방법을 알 수 없었습니다. – NateH06

답변

5

collect(toList()) 방법은 Stream<Child1> 그 타겟 타입에 호출된다. (이 예는 혼란 Meeting 정말로 Parent는?) getChild1List의 최초 버전에

- List<Parent>입니다. 이는 T 유형의 스트림이 T의 상위 유형 콜렉터에 의해 수집되도록 허용 되었기 때.에 작동합니다.보다 구체적으로, 유형 안전하고 허용되는 List<Parent>Child1 유형의 인스턴스를 추가합니다. 대신 List<Child1>을 반환하는 getChild1List()의 선언을 변경할 수도 있습니다.

당신은 분산이 Stream<T>collect()의 선언을보고에 의해 허용되는 경우 볼 수 있습니다

<R,A> R collect(Collector<? super T,A,R> collector) 

? super T는 분산을 허용하는 것이다. returnsListByContact

귀하의 선언,

<T extends Parent> List<T> returnsListByContact(List<T> childList, ...) 

하지이 분산을 허용한다. 이 매개 변수는 List<T> 유형의 매개 변수를 사용하고 List<T>을 반환합니다. 매개 변수와 반환 유형은 동일해야합니다. 따라서 List<Child1>을 전달하고 반환 유형이 List<Parent> 인 메소드에서 반환하려고하면 불일치가 발생합니다. 이러한 유형은 호환되지 않습니다.

이 문제를 해결하려면 returnsListByContact 선언에 약간의 차이를 추가해야합니다.이것은 몇 가지 하위 유형의 목록을 전달하는 동안 몇 가지 유형의 목록을 반환 할 수 있습니다

<T extends Parent> List<T> returnsListByContact(List<? extends T> childList, ...) 

입니다 List<Child1>에 통과하면서 List<Parent> 반환이 경우에 나는 당신을 생각 : 여기에 내가 그것을 할 거라고 방법 필요.

+2

첫 문장에 하나 더하기, 나는 그것의 주위에 나의 머리를 역시 얻을 수 없었다. – Eugene

+0

예, Meeting은 실제 이름입니다. 인스턴스는 Parent입니다. 내 원본 코드를 수정하여 명확하게 처리했습니다. 나는 아이러니하게도 이것을 일반인들에게 읽을 수있게 만들었다. ...이 프로젝트에서 너무 많은 시간이 걸렸다. ... – NateH06

+0

이 작업을 처리 할 시간이 있었고 수정 사항이 멋지게 작동했다. 나는'.collect()'의 리턴 타입이 여러분이'Stream'에 공급 한 것을 기반으로하고, 메소드의 리턴 타입이 결과에 영향을 미치지 않았다는 것을 알았습니다. 정말 고맙습니다! – NateH06