2013-09-25 8 views
0

가정하자 내가 가진 자바 클래스 나는 또한 당신은 할 수 없습니다과부하 유형 매개 변수

public class Foo<ELEMENT extends Comparable> { 
    public Foo(ELEMENT e) { 
     this(e, new Comparator<ELEMENT>() { 
      public int compare(ELEMENT e1, ELEMENT e2) { 
       return e1.compareTo(e2); 
      } 
     }) 
    } 
} 

답변

3

같은 뭔가를 할 수 있도록 형식 매개 변수 <ELEMENT>를 다시로드 할 수 있습니다 방법

public class Foo<ELEMENT, COMPARATOR extends Comparator<ELEMENT>> { 
    public Foo(ELEMENT e, COMPARATOR c) {...} 
} 

기본적으로. (TreeSet은 가능한 경우 클래스의 예제입니다.)

반면에 할 수있는 한 가지 방법은 public 생성자 대신 정적 팩터 리 메서드를 사용하는 것입니다. 예를 들어, 다음과 같이 쓸 수 있습니다.

public class Foo<E> { 
    public static <E> Foo<E> withComparator(E e, Comparator<? super E> comparator){ 
    ... 
    } 
    public static <E extends Comparable> Foo<E> withoutComparator(E e) { 
    ... 
    } 
} 

이렇게하면 다른 팩토리 방식에 다른 유형 제약 조건을 적용 할 수 있습니다. Comparator을 사용하지 않는 오버로드에 Comparable 제약 조건을 추가합니다.

+0

감사합니다. –

+0

솔루션에서 유형 매개 변수 'COMPARATOR'가 클래스 정의에서 제거되었습니다. 매개 변수를 유지하려면 어떻게해야합니까? –

+0

당신이하고있는 일을 설명 할 수 있습니까? 콤퍼레이터는 객체가 아닌 유형이어야합니다. 일반적으로 비교기에서는 이해가되지 않습니다. –