2014-10-16 5 views
2

으로 변환 할 수 없습니다. 구아바의 Ordering 클래스에서이 이상한 조건을 만났습니다. 삼원 연산자를 사용하여이 코드구아바의 삼항 연산자 문제 : 주문 번호 <Comparable>을 주문 번호 <String>

:

Ordering<String> ordering = flag ? Ordering.natural().nullsFirst() : Ordering.natural().nullsLast(); 

참고 flag 부울 변수이다.

그 라인 이클립스에 표시된이 오류 가지고 :

Type mismatch: cannot convert from Ordering<Comparable> to Ordering<String> 


을하지만 경우 - 다른 블록으로 변경하는 경우, 오류가 없습니다.

Ordering<String> ordering; 
    if (flag) { 
     ordering = Ordering.natural().nullsFirst(); 
    } 
    else { 
     ordering = Ordering.natural().nullsLast(); 
    } 

누구든지 여기서 무슨 일이 일어 났는지 설명 할 수 있습니까?

참고 : 내가 사용 자바 7

+3

이것은 Java 7의 제네릭 형식 유추의 제한 사항입니다. 8로 업그레이드하면 문제가 없습니다. 할 수 없다면, 명시 적 타입 인자를 사용하거나'if' 솔루션을 사용하십시오. –

+0

제한 사항에 대해 자세히 설명해 주시겠습니까? 'Ordering '로 변경하면 오류가 사라지지만 "Comparable은 원시 형식입니다. 제네릭 형식 Comparable 을 매개 변수화해야합니다"라는 경고가 표시됩니다. 그런 다음 'Ordering >'으로 변경하면 오류가 다시 발생합니다. <: o) – null

+0

일반 메소드에 명시적인 유형을 지정하기 만하면됩니다. Java 7 컴파일러는 원하는 것을 해결할 수 없습니다. –

답변

3

변경 :

Ordering<String> ordering = flag ? Ordering.natural().nullsFirst() : Ordering.natural().nullsLast(); 

에 : 그것은 자바 컴파일러를 알려주기 때문에

Ordering<String> ordering = flag ? Ordering.<String>natural().nullsFirst() : Ordering.<String>natural().nullsLast(); 

이 작동 그 natural 방법에 <C> 선언은 String이어야합니다. Ordering.<String>natural()를 호출하여

public static <C extends Comparable> Ordering<C> natural() 

, 당신은 명시 적으로 <String>을 할 <C>를 선언하고 다음은 natural에 대한 구아바의 Ordering 클래스의 메소드 선언입니다.

이 방법은 거의 모든 정적 메서드 Collections과 같이 메서드 선언의 일부로 선언 된 형식을 가진 메서드에서 작동합니다.