2013-09-04 2 views
2

특정 중복을 제거하고 List에서 작동하는 메서드가 있습니다. 알고리즘은 RandomAccess을 구현하는 목록에서만 효율적입니다. 오용과 실망스러운 성능을 방지하기 위해 RandomAccess 제한을 적용하는 방법을 궁금합니다. RandomAccess 인터페이스는 불행하게도 List을 확장하지 않으므로 변수를 한 번에 두 가지 유형으로 만들 필요가 있습니다.메서드를 RandomAccess 목록으로 제한

나는 ArrayList보다는 List을 수용 할 수있는 방법을 선언 할 수 있지만, 다른 목록 유형 (예를 들어, 목록이 Collections.synchronizedListCollections.checkedList에 의해 반환) 너무 RandomAccess을 구현할 수 있고, 나는 그를 차단하고 싶지 않아요. 덜 강력한 인

if (!(list instanceof RandomAccess)) 
    throw new UnsupportedOperationException("RandomAccess list required"); 

그러나 제한은 런타임에 적용됩니다 :

나는 제네릭을 시도했지만 작동 구문을 만들 수 없습니다 :

public <T> void process(<List<T> extends RandomAccess> list) { 
    ... 
} 

은 내가 할 수있는을 .

도움 말?

+1

: A (비 컴파일 가능한, 두 번째 호출을 제거하지 않는) 클래스로 퍼팅

public <T,L extends List<T> & RandomAccess> void process(L list) 

여기를보세요 : http://stackoverflow.com/q/745756/484441 – nmaier

답변

3

당신은 앰퍼샌드 (&)로 표시 여러 경계를 사용해야합니다

public class Main { 

    public static void main(String[] argv) 
    throws Exception 
    { 
     Main x = new Main(); 
     x.process(new ArrayList<String>()); 
     x.process(new LinkedList<String>()); 
    } 

    public <T,L extends List<T> & RandomAccess> void process(L list) { 

    } 
} 
+1

2 개의 매개 변수가없는 경우 : public static > void 프로세스 (T 목록) { – agad

+0

@agad - 저는 아닙니다. 네가 무엇을 요구하는지 확신해라. 귀하의 예제는 일반적으로 중요한 목록 요소에 대한 경계를 적용하지 않습니다. – parsifal

+0

나는 T에 의한 매개 변수화가 필요하지 않다는 것을 묻지 않습니다. 단순화를 위해 하나의 매개 변수로 메소드를 매개 변수화하는 것만으로 충분합니다. 그것은 중요하지 않다. 어떤 요소에 목록이 포함되어 있는지, 중요하다. 인수는 임의 액세스 목록이다. – agad