2016-10-23 4 views
4

PrimitiveIterator.OfIntIterator<Integer>으로 확장 되나 IntStream은 확장되지 않으므로 Stream<Integer>은 확장되지 않습니까?Java의 기본 특수화가 일치하지 않음

(Apache Commons Primitives 라이브러리 (http://commons.apache.org/dormant/commons-primitives/)의 인터페이스와 유사하며 컬렉션 라이브러리와 일관성 있고 호환되도록 노력하고 있지만 원시 스키마 형식을 설계해야합니다. . 내 ByteListList<Byte> 여부를 확장 할

내 생각 엔이이 Iterator 언어에서 직접 구문 지원이 있기 때문이다 (즉, 반복자를 사용하여 루프) 그래서 그것은 권투를 강제하더라도 그 구문을 사용하여 반복자가 호환 만드는 가치, 하지만 더 깊은 이유가 있는지 아는 사람은 궁금합니다. 감사합니다.

+0

내 생각에 그들은 'Stream'을 확장하기 위해 인터페이스를 어지럽히고 싶지 않았을 것입니다. 모든 메소드를 유지하고 원시 버전으로 복제해야했습니다. 아마도 'Iterater'의 인터페이스가 훨씬 작아서 (원시 타입 당 두 개의 메소드 만 복제되었다는 것) 아마이 경우에는 디자이너가 받아 들일 만하다고 느꼈을 것입니다. – Hulk

+3

'PrimitiveIterator.OfInt'는'Iterator'와의 완전한 네이밍 충돌을 가지고 있지 않습니다; 'nextInt' 메소드를 하나만 추가하는 반면'IntStream'은 모든 다른 메소드를 가지고 있습니다 - 특히'filter'는'IntPredicate'와'Predicate '으로 유용하게 오버로드 할 수 없습니다. –

+0

프리미티브 반복자에 해당하는 'Spliterator'의 원시 버전. [Spliterator.OfInt] (https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.OfInt.html)에서는 래퍼와 프리미티브를 모두 제공하는 일반 슈퍼 인터페이스 인 'Spliterator '을 구현합니다. 해당 메소드의 버전. 그러나 그들은 어쨌든 두 가지 방법 밖에 가지고 있지 않으며 과부하가 잘 작동합니다. – Hulk

답변

0

JDK API가 왜 그런 식으로 설계되었는지는 거의 알 수 없지만,이 경우에는 Stream<Integer>IntStream의 API를 함께 만들려고하면 쉽게 이해할 수 없다는 것을 알 수 있습니다. 왜냐하면 많은 모호함이 있기 때문입니다. 두 인터페이스의 메소드 정의. 메소드의 서명이 동일하기 때문에

interface Stream<T> { 
    Stream<T> distinct(); 
    Optional<T> findFirst(); 
} 

interface IntStream extends Stream<Integer> { 
    IntStream distinct(); 
    OptionalInt findFirst(); 
} 

두 번째 인터페이스는 이벤트 컴파일되지 않을 것이다, 그러나 반환 형식은 두 번째 인터페이스에서 다른 :

는 다음과 같은 고려하십시오.

우리가 람다를 받아들이는 동일한 방법의 여러 구현을 제공 할 때조차도 호환 방법이 어려워 질 수 있습니다. 주어진 람다가 여러 기능적 인터페이스를 구현할 수 있기 때문에 람다와 메서드 오버로딩은 일반적으로 잘 작동하지 않습니다. 예를 들면 : 당신이 stream.filter(n -> n > 10) 같은 호출이있는 경우

interface Stream<T> { 
    Stream<T> filter(Predicate<T> p); 
    <S> Stream<S> map(Function<T,S> mapper); 
} 

interface IntStream extends Stream<Integer> { 
    IntStream filter(IntPredicate p); 
    IntStream map(IntUnaryOperator mapper); 
} 

자,이 람다 실제로 모두 Predicate<Integer> 또는 IntPredicate을 구현할 수 있습니다 지금은 API 사용자는 동음이, 예를 들면, 일종의을 강제로 컴파일러가 차이를 알 수 없기 때문에 (int n) -> n > 10입니다.

장기적으로 이것은 StreamIntStream API의 발전을 방해 할 수 있습니다.