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
입니다.
장기적으로 이것은 Stream
및 IntStream
API의 발전을 방해 할 수 있습니다.
내 생각에 그들은 'Stream'을 확장하기 위해 인터페이스를 어지럽히고 싶지 않았을 것입니다. 모든 메소드를 유지하고 원시 버전으로 복제해야했습니다. 아마도 'Iterater'의 인터페이스가 훨씬 작아서 (원시 타입 당 두 개의 메소드 만 복제되었다는 것) 아마이 경우에는 디자이너가 받아 들일 만하다고 느꼈을 것입니다. – Hulk
'PrimitiveIterator.OfInt'는'Iterator'와의 완전한 네이밍 충돌을 가지고 있지 않습니다; 'nextInt' 메소드를 하나만 추가하는 반면'IntStream'은 모든 다른 메소드를 가지고 있습니다 - 특히'filter'는'IntPredicate'와'Predicate'으로 유용하게 오버로드 할 수 없습니다. –
프리미티브 반복자에 해당하는 'Spliterator'의 원시 버전. [Spliterator.OfInt] (https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.OfInt.html)에서는 래퍼와 프리미티브를 모두 제공하는 일반 슈퍼 인터페이스 인 'Spliterator'을 구현합니다. 해당 메소드의 버전. 그러나 그들은 어쨌든 두 가지 방법 밖에 가지고 있지 않으며 과부하가 잘 작동합니다. –
Hulk