2017-11-06 6 views
1

GWT 에뮬레이트 된 (클라이언트 측) jdk 메소드 indexOf()가 예상대로 작동하지 않습니다.GWT 에뮬레이트 된 indexOf()가 jdk에 비해 잘못되었습니다. indexOf()

예 :.

내가 3 NaN이 포함 된 목록을 가지고는 객체 :

List<Double> doubleList = new ArrayList<Double>(); 
doubleList.add(Double.NaN); 
doubleList.add(Double.NaN); 
doubleList.add(Double.NaN); 

내가 Double.NaN의 인 분 값을 검색 :

Double minValue = Collections.min(doubleList); //minValue = Double.NaN 

모든 것이 클라이언트와 서버 측에서 예상 노력으로 지금까지 .

는 지금은 MINVALUE의 인덱스를 얻기 위해 노력하고 있어요 :

Integer index = doubleList.indexOf(minValue); 

재미가 시작하는 곳입니다. 서버 측 (단순 유닛 테스트) jdk ArrayList 클래스의 indexof() 메소드는 0을 반환합니다. 에뮬레이트 된 ArrayList 클래스 (클라이언트 측)는 -1이 올바르지 않은 경우를 반환하지만 분명히 그렇지 않은 경우 값이 발견되지 않으면 -1이 반환되어야하므로 올바르지 않습니다.

왜 이런 생각입니까?

GWT 같이 IndexOf() :

int indexOf(Object o, int index) { 
    for (; index < array.length; ++index) { 
     if (Objects.equals(o, array[index])) { 
     return index; 
     } 
    } 
    return -1; 
    } 

GWT는

+0

정수 또는 긴 목록에도 동일한 문제가 있습니까? – vanje

+0

@vanje Integer/Long을 테스트하지 않았습니다. 아무런 차이가 없다고 가정합니다. 이것은 NaN 객체에만 해당됩니다. – CrazySabbath

답변

0

In JavaScript NaN === NaN is falseclass ArrayList을 에뮬레이트하지만 자바 Double.NaN.equals(Double.NaN)는 사실이다. 따라서 indexOf() 메서드의 비교는 NaN에서 작동하지 않습니다. 올바른 구현은이 경우 JavaScript 함수 isNaN()을 사용합니다.

+0

그 말이 맞습니다. 비록 indexOf() 메소드가 2.7.0 버전에서 2.8.2 버전으로 바뀌었고 NaN 비교가 2.7.0 버전과 작동한다는 것을 알았지 만 (이제 2.7.0 indexOf 에뮬레이션을 찾으려고합니다) – CrazySabbath

+0

재미있을 것입니다. 두 버전 모두에 대해 컴파일 된 JavaScript 코드를 살펴보십시오. 불행히도, 나는 그런 것들을 할 시간이 없다. – vanje

+0

github.com/gwtproject/gwt/issues에서이 문제를 해결할 수 있습니까? –