Java, Google Collections Library; Abstractiterator의 문제?
문제
Google Collections 라이브러리를 사용하고 있습니다 Abstractiterator 발전기를 구현합니다. 나는 그렇게하는 동안 문제를 가로 질러 달렸다. 나는 그것을보다 기본적인 유형으로 줄이고 문제를 재현했습니다. 이 감소는 반복 가능한 반복을 통해 1에서 숫자로 계산하는 일에 대해 분명히 과도합니다.
기본적으로 다음 코드에서는 무인 버전이 작동하며 주석은 하나가 작동하지 않습니다 (마지막 숫자에서 끝나는 대신 널 요소를 마지막으로 제공합니다).
내가 뭔가 잘못하고 있습니까, 아니면 도서관에 문제가 있습니까?
private Iterable<Integer> elementGenerator(final int numelements) {
return new Iterable<Integer>() {
@Override public Iterator<Integer> iterator() {
return new AbstractIterator<Integer>(){
int localcount=0;
@Override protected Integer computeNext() {
if (localcount++ == numelements) return endOfData();
return localcount;
// return (localcount++ == numelements) ? endOfData() : localcount;
}
};
}
};
}
나는 또한 주위를 다루려고 노력했다 ?:
배열 (예 : 리턴을 접두사하고 대신 +1과 비교), 소용이 없습니다. 나는 이것에 대한 문서를 조금만 찾았지만 아무것도 찾지 못했습니다. 분명히 ?:
구문은 편의성 일뿐 아니라 필수는 아니지만 여전히 ...
해결책
당신은 얻는다 NullPointerException
3 원 운영자의 사용으로 인해, 다른 수치 유형의 조건부 표현. Java는 3 원 표현에서 다른 유형의 수치 값을 혼합 할 때 복잡한 규칙을 가지고 있습니다. JLS Section 15.25
.
을 고려하면 endOfData()
돌아 오는 것이 선례입니다 Integer
, 동안 localcount
이다 int
, Java Unboxes의 값 endOfData()
. 그러나 그 점을 감안할 때 endOfData()
널을 반환하고, Unboxing 조작은 NULL 포인터 예외로 만듭니다.
IF 문을 계속 사용하거나 LocalCount를 다음과 같이 선언 할 수 있습니다. Integer
.
다른 팁
문제는 3 원 운영자와 함께 분쟁 후 연산자를 사용하는 것입니다. 그 바로 그만큼 두 개의 스 니펫은 완전히 동일해야합니다. 그리고 그 시점에서 코드 중 어느 것도 호출되지 않았으므로 초록 리터 레이터의 잘못이 아닙니다.