2011-02-18 3 views
1

다음과 같이 중첩 된 일반 매개 변수를 사용하여 MinMaxPriorityQueue를 만드는 방법 :중첩 된 일반 매개 변수로 MinMaxPriorityQueue를 만드는 방법은 무엇입니까?

MinMaxPriorityQueue<AtomicCountHolder<E>> sortedHeap; 

정적 create() 메서드로 생각할 수있는 모든 종류의 변형을 시도하고 빌더를 사용하지 마십시오. 그것은

MinMaxPriorityQueue<Integer> s = MinMaxPriorityQueue. <Integer>create(); 

함께 작동하지만 중첩 제네릭 아닙니다. 모든 단서가 도움이 될 것입니다.

답변

7

MinMaxPriorityQueue.create()은 제네릭 유형이 Comparable 인터페이스를 구현해야한다는 제약 조건을 부과합니다. 즉, 해당 유형의 자연스러운 순서가 있습니다.

AtomicCountHolder<E>Comparable을 구현하지 않는다고 가정합니다. 이 경우 유형의 순서를 정의하는 사용자 정의 Comparator을 제공해야합니다. 예를 들어,

MinMaxPriorityQueue<AtomicCountHolder<E>> sortedHeap = MinMaxPriorityQueue.orderedBy(Ordering.natural().onResultOf(someFunction)).create(); 

이것은 당신이 AtomicCountHolder<E>을 소요하고 Integer 같은 Comparable 무언가를 반환하는 Function을 가정합니다. E이 있다고 가정하면 AtomicCountHolder<E extends Comparable<? super E>>을 사용하는 Function을 쓰고 AtomicCountHolder이 무엇이든 반환합니다.

무엇이 AtomicCountHolderbtw입니까? AtomicInteger과 같은가요?

+0

AtomicCountHolder 은 AtomicInteger를 확장합니다. 그래서 Comparable을 구현해야합니다. –

+1

@Hein :'AtomicInteger'는'Comparable'이 아닙니다. – ColinD

0

편집 : @ sjr 님의 답변이 맞습니다. 그러면 AtomicCountHolder<E> 클래스는 Comparable<AtomicCountHolder<E>>을 구현해야합니다. AtomicInteger은 그런 식으로 Comparable<AtomicInteger>을 구현하지 않습니다.


또한 E은 선언 된 유형이어야합니다. 당신은 E라는 이름의 매개 변수 유형을 가진 클래스의 우선 순위 큐를 정의 할 필요가 다음 중 하나

public class Example<E> { 
    MinMaxPriorityQueue<AtomicCountHolder<E>> sortedHeap = 
     MinMaxPriorityQueue.create(); 
} 

... 또는 당신이 그 자리에 기존의 유형을 지정해야합니다

MinMaxPriorityQueue<AtomicCountHolder<Integer>> sortedHeap = 
    MinMaxPriorityQueue.create(); 

또한 수를 MinMaxPriorityQueue가 가정합니다

MinMaxPriorityQueue<AtomicCountHolder<?>> sortedHeap = 
    MinMaxPriorityQueue.create(); 
+0

이 첫 번째 스케치는 예제 처럼 최상위 클래스에서 선언 된 매개 변수 유형 E를 가지고 있지만 MaxMaxPriorityQueue.create() 접근 방식이 작동하지 않습니다. 다음을 제공합니다. 바운드 불일치 : MinMaxPriorityQueue 유형의 제너릭 메소드 create()는 arguments()에 적용 할 수 없습니다. 유추 된 유형 예제.AtomicCountHolder 은 바운드 된 매개 변수 >의 유효한 대체 단어가 아닙니다. –

+0

편집을 참조하십시오. 기본적으로 'AtomicCountHolder'는 Comparable이어야하며 @sjr이 ​​가리키는 것과 다릅니다. – ide

+0

업! 감사. 이것은 내 문제를 해결할 것 같습니다. 감사! 나는 좀 더 구체적인 예를 들어보고 할 것이다. –

0

참고 : (AtomicCountHolder의 매개 변수 유형에 아무런 제약이없는 가정)은 일반적으로 다른 곳에서하는 것처럼 와일드 카드를 사용하여 그 요소가 주문을 변경하는 방식으로 변하지 않는다는 것을 의미합니다. 이름에서 알 수 있듯이 AtomicCountHolder 클래스가 변경 가능하면 잘못된 동작을 할 수 있습니다.

관련 문제